vibebug 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":["../src/utils/constants.ts","../src/utils/ring-buffer.ts","../src/core/runner.ts","../src/core/signature.ts","../src/core/cost-estimator.ts","../src/core/git-context.ts","../src/db/schema.ts","../src/utils/paths.ts","../src/db/connection.ts","../src/db/migrate.ts","../src/db/queries.ts","../src/core/capture.ts","../src/core/stream-detector.ts","../src/commands/wrap.ts","../src/commands/init.ts","../src/commands/list.ts","../src/server/routes/api.ts","../src/server/index.ts","../src/commands/dash.ts","../src/commands/fix.ts","../src/commands/export.ts","../src/commands/config.ts","../src/index.ts"],"sourcesContent":["export const VERSION = '0.1.0';\nexport const APP_NAME = 'vibebug';\nexport const DB_FILENAME = 'vibebug.db';\nexport const VIBEBUG_DIR = '.vibebug';\nexport const DEFAULT_DASHBOARD_PORT = 7600;\nexport const DEFAULT_RING_BUFFER_SIZE = 200 * 1024; // 200KB\nexport const DEFAULT_TAIL_LINES = 200;\nexport const DEFAULT_STREAM_QUIET_TIMEOUT_MS = 2000;\nexport const DEFAULT_STREAM_COOLDOWN_MS = 60_000;\nexport const MAX_ERROR_BLOCK_LINES = 50;\nexport const MAX_DIFF_SIZE = 50 * 1024; // 50KB\n\n// AI cost estimation defaults (per million tokens)\nexport const DEFAULT_AI_MODEL = 'claude-sonnet';\nexport const AI_PRICING: Record<string, { input: number; output: number }> = {\n 'claude-sonnet': { input: 3.0, output: 15.0 },\n 'claude-opus': { input: 15.0, output: 75.0 },\n 'claude-haiku': { input: 0.25, output: 1.25 },\n 'gpt-4o': { input: 2.5, output: 10.0 },\n};\nexport const DEFAULT_ESTIMATED_OUTPUT_TOKENS = 1000;\nexport const CHARS_PER_TOKEN = 4;\n","/**\n * A fixed-capacity ring buffer for accumulating stream output.\n * When the buffer exceeds maxBytes, the oldest chunks are dropped.\n */\nexport class RingBuffer {\n private chunks: Buffer[] = [];\n private totalBytes = 0;\n private maxBytes: number;\n\n constructor(maxBytes: number) {\n this.maxBytes = maxBytes;\n }\n\n push(chunk: Buffer): void {\n this.chunks.push(chunk);\n this.totalBytes += chunk.length;\n\n // Drop oldest chunks until we're under the limit\n while (this.totalBytes > this.maxBytes && this.chunks.length > 1) {\n const dropped = this.chunks.shift()!;\n this.totalBytes -= dropped.length;\n }\n }\n\n toString(): string {\n return Buffer.concat(this.chunks).toString('utf-8');\n }\n\n get size(): number {\n return this.totalBytes;\n }\n}\n","import { spawn } from 'node:child_process';\nimport type { RunResult } from '../types/index.js';\nimport { RingBuffer } from '../utils/ring-buffer.js';\nimport { DEFAULT_RING_BUFFER_SIZE } from '../utils/constants.js';\n\nexport async function runCommand(argv: string[], onChunk?: (text: string) => void): Promise<RunResult> {\n if (argv.length === 0) {\n return {\n exitCode: 1,\n signal: null,\n stdout: '',\n stderr: 'No command provided',\n durationMs: 0,\n command: '',\n };\n }\n\n const commandStr = argv.join(' ');\n const startTime = performance.now();\n const stdoutBuffer = new RingBuffer(DEFAULT_RING_BUFFER_SIZE);\n const stderrBuffer = new RingBuffer(DEFAULT_RING_BUFFER_SIZE);\n\n return new Promise<RunResult>((resolve) => {\n // Use shell with the full command as a single string to preserve quoting\n const child = spawn(commandStr, [], {\n stdio: ['inherit', 'pipe', 'pipe'],\n env: {\n ...process.env,\n FORCE_COLOR: '1',\n },\n shell: true,\n });\n\n child.stdout?.on('data', (chunk: Buffer) => {\n process.stdout.write(chunk);\n stdoutBuffer.push(chunk);\n onChunk?.(chunk.toString('utf-8'));\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n process.stderr.write(chunk);\n stderrBuffer.push(chunk);\n onChunk?.(chunk.toString('utf-8'));\n });\n\n // Forward signals to child\n const onSigInt = () => child.kill('SIGINT');\n const onSigTerm = () => child.kill('SIGTERM');\n process.on('SIGINT', onSigInt);\n process.on('SIGTERM', onSigTerm);\n\n child.on('close', (exitCode, signal) => {\n process.removeListener('SIGINT', onSigInt);\n process.removeListener('SIGTERM', onSigTerm);\n\n const durationMs = Math.round(performance.now() - startTime);\n\n resolve({\n exitCode: exitCode ?? (signal ? 1 : 0),\n signal: signal ?? null,\n stdout: stdoutBuffer.toString(),\n stderr: stderrBuffer.toString(),\n durationMs,\n command: commandStr,\n });\n });\n\n child.on('error', (err) => {\n process.removeListener('SIGINT', onSigInt);\n process.removeListener('SIGTERM', onSigTerm);\n\n const durationMs = Math.round(performance.now() - startTime);\n resolve({\n exitCode: 1,\n signal: null,\n stdout: stdoutBuffer.toString(),\n stderr: err.message,\n durationMs,\n command: commandStr,\n });\n });\n });\n}\n","import { createHash } from 'node:crypto';\n\n/**\n * Anchor-based signature algorithm for stable error deduplication.\n *\n * Instead of hashing the full log (fragile — minor noise differences split\n * the same error into multiple signatures), we:\n * 1. Normalize the log (strip timestamps, UUIDs, hex, paths, whitespace)\n * 2. Extract anchors: error header lines + top stack frames\n * 3. Hash only the anchors + command → stable signature\n *\n * Falls back to full-log hash when no anchors are detected.\n */\nexport function generateSignature(rawLog: string, command: string): string {\n const normalized = normalizeLog(rawLog);\n const anchors = extractAnchors(normalized);\n const input = anchors.length > 0\n ? `${anchors.join('\\n')}\\n${command}`\n : `${normalized}\\n${command}`;\n return createHash('sha256').update(input).digest('hex').slice(0, 16);\n}\n\n/**\n * Extract stable anchor lines from normalized error output.\n * Anchors are: error header lines + top stack frames / key diagnostic lines.\n */\nexport function extractAnchors(normalizedLog: string): string[] {\n const lines = normalizedLog.split('\\n').map(l => l.trim()).filter(Boolean);\n const anchors: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Error header lines — the most important anchors\n if (isErrorHeader(line)) {\n anchors.push(line);\n // Collect up to 5 subsequent stack frames or diagnostic context\n const frames = collectStackFrames(lines, i + 1, 5);\n anchors.push(...frames);\n }\n }\n\n // Dedupe while preserving order (same error header can appear in summary sections)\n return [...new Set(anchors)];\n}\n\n/**\n * Matches error header lines — the first line of an error message.\n */\nfunction isErrorHeader(line: string): boolean {\n return ERROR_HEADER_PATTERNS.some(re => re.test(line));\n}\n\nconst ERROR_HEADER_PATTERNS = [\n // JS/TS errors\n /^(Error|TypeError|ReferenceError|SyntaxError|RangeError|URIError|EvalError):/,\n /^Uncaught\\s/,\n // TypeScript compiler\n /error TS\\d+:/,\n // Rust compiler\n /^error\\[E\\d+\\]:/,\n /^error: aborting due to/,\n // Python\n /^(ModuleNotFoundError|ImportError|ConnectionRefusedError|AssertionError|AttributeError|KeyError|ValueError|RuntimeError|FileNotFoundError|PermissionError|OSError):/,\n /^Traceback \\(most recent call last\\)/,\n // Go\n /^panic:/,\n // npm\n /^npm ERR! code /,\n // Build tools\n /^Build failed/i,\n /^Failed to compile/i,\n /Module not found/,\n /Cannot find module/,\n // Vite/Rollup\n /Rollup failed to resolve import/,\n // ESLint\n /ESLint couldn't find the config/,\n // Generic\n /^FATAL/i,\n /^ERROR\\s/,\n /CompileError/,\n /ELIFECYCLE/,\n];\n\n/**\n * Collect stack frame lines after an error header.\n * Stack frames are lines that look like:\n * - \" at Function.name (file:line:col)\" (JS)\n * - \" File \"path\", line N\" (Python)\n * - \" file.go:42 +0x1a5\" (Go)\n * - \" --> src/main.rs:15:20\" (Rust)\n * - Lines starting with whitespace that are part of the error context\n *\n * Also captures key diagnostic lines that aren't stack frames but are\n * important for deduplication (e.g., \"Property 'X' is missing in type 'Y'\").\n */\nfunction collectStackFrames(lines: string[], startIdx: number, maxFrames: number): string[] {\n const frames: string[] = [];\n let collected = 0;\n\n for (let i = startIdx; i < lines.length && collected < maxFrames; i++) {\n const line = lines[i];\n\n // Stop at empty lines, separators, or new error headers\n if (!line || /^[-=_]{3,}$/.test(line) || /^$/.test(line)) break;\n if (isErrorHeader(line)) break;\n\n // Stack frame patterns\n if (STACK_FRAME_PATTERNS.some(re => re.test(line))) {\n frames.push(line);\n collected++;\n continue;\n }\n\n // Diagnostic context lines (indented or continuation of error)\n if (/^\\s+/.test(lines[startIdx - 1] ? line : '') || isDiagnosticLine(line)) {\n frames.push(line);\n collected++;\n continue;\n }\n }\n\n return frames;\n}\n\nconst STACK_FRAME_PATTERNS = [\n // JS: \"at Function.name (file:line:col)\"\n /^\\s*at\\s/,\n // Python: \"File \"path\", line N\"\n /^\\s*File\\s+\"/,\n // Go: \"file.go:42 +0x...\"\n /^\\s+[\\w./]+\\.go:\\d+/,\n // Rust: \"--> src/file.rs:line:col\"\n /^\\s*-->/,\n // Generic: \"path:line:col\"\n /^\\s*[\\w./]+\\.\\w+:<L>:<C>/,\n];\n\n/**\n * Lines that provide diagnostic context for the error (not stack frames\n * but important for deduplication).\n */\nfunction isDiagnosticLine(line: string): boolean {\n return DIAGNOSTIC_PATTERNS.some(re => re.test(line));\n}\n\nconst DIAGNOSTIC_PATTERNS = [\n // TS: \"Property 'X' is missing\"\n /Property '.+' is missing/,\n // TS: \"Type 'X' is not assignable to type 'Y'\"\n /Type '.+' is not assignable/,\n // TS: \"Cannot find name 'X'\"\n /Cannot find name/,\n // TS: \"Cannot find module 'X'\"\n /Cannot find module/,\n // Rust: \"expected `X`, found `Y`\"\n /expected `.+`, found/,\n // Rust: \"cannot borrow\"\n /cannot borrow/,\n // Python: \"E ...\"\n /^E\\s{2,}/,\n // Go: \"cannot use\"\n /cannot use/,\n // npm: peer dependency info\n /peer .+ from/,\n // ESLint rule names\n /@typescript-eslint\\//,\n // Vite/Rollup: resolve info\n /explicitly add it to/,\n];\n\n/**\n * Normalize raw log output to strip variable noise.\n * IMPORTANT: preserves newlines so anchor extraction can work line-by-line.\n * Exported for testing.\n */\nexport function normalizeLog(raw: string): string {\n let s = raw;\n\n // Strip ANSI escape codes\n s = s.replace(/\\x1b\\[[0-9;]*[a-zA-Z]/g, '');\n\n // Strip timestamps (ISO, common log formats)\n s = s.replace(/\\d{4}-\\d{2}-\\d{2}[T_]\\d{2}[:\\-_]\\d{2}[:\\-_]\\d{2}[.\\d_Z]*/g, '<TS>');\n\n // Strip time-only patterns (HH:MM:SS AM/PM)\n s = s.replace(/\\d{1,2}:\\d{2}:\\d{2}\\s*(AM|PM)?/gi, '<TS>');\n\n // Strip hex addresses\n s = s.replace(/0x[0-9a-fA-F]{6,}/g, '<HEX>');\n\n // Strip UUIDs\n s = s.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, '<UUID>');\n\n // Strip build hashes (common in bundler output: dep-jDlpJr2x.js, chunk-abc123.js)\n s = s.replace(/\\b(dep|chunk|vendor|assets?)-[a-zA-Z0-9_-]{4,}\\b/g, '$1-<HASH>');\n\n // Strip absolute paths, keep basename\n s = s.replace(/(?:\\/[\\w.@-]+)+\\/([\\w.@-]+)/g, '$1');\n\n // Strip line/column numbers in file references\n s = s.replace(/([\\w.-]+):\\d+:\\d+/g, '$1:<L>:<C>');\n\n // Strip line-only references (file:line)\n s = s.replace(/([\\w.-]+):(\\d+)\\b(?!:)/g, '$1:<L>');\n\n // Strip timing info (e.g., \"in 2.34s\", \"3.01s\")\n s = s.replace(/\\b\\d+\\.\\d+s\\b/g, '<DUR>');\n\n // Strip counts that vary (e.g., \"collected 45 items\", \"203 modules\")\n s = s.replace(/\\b\\d+ (items?|modules?|files?|tests?|errors?|warnings?|problems?)\\b/gi, '<N> $1');\n\n // Strip version numbers (e.g., \"v5.1.4\", \"Python 3.11.5\")\n s = s.replace(/v?\\d+\\.\\d+\\.\\d+/g, '<VER>');\n\n // Strip platform identifiers that vary between machines\n s = s.replace(/\\bplatform (linux|darwin|win32|windows)\\b/gi, 'platform <PLATFORM>');\n\n // Collapse horizontal whitespace (preserve newlines for anchor extraction)\n s = s.replace(/[^\\S\\n]+/g, ' ');\n\n // Collapse multiple blank lines into one\n s = s.replace(/\\n{3,}/g, '\\n\\n');\n\n return s.trim();\n}\n","import {\n AI_PRICING,\n DEFAULT_AI_MODEL,\n DEFAULT_ESTIMATED_OUTPUT_TOKENS,\n CHARS_PER_TOKEN,\n} from '../utils/constants.js';\n\nexport interface CostEstimate {\n inputTokens: number;\n outputTokens: number;\n cost: number;\n}\n\nexport function estimateCost(rawLogLength: number, model?: string): CostEstimate {\n const modelKey = model ?? DEFAULT_AI_MODEL;\n const pricing = AI_PRICING[modelKey] ?? AI_PRICING[DEFAULT_AI_MODEL]!;\n\n const inputTokens = Math.ceil(rawLogLength / CHARS_PER_TOKEN);\n const outputTokens = DEFAULT_ESTIMATED_OUTPUT_TOKENS;\n\n // Pricing is per million tokens\n const cost = (inputTokens * pricing.input + outputTokens * pricing.output) / 1_000_000;\n\n return { inputTokens, outputTokens, cost };\n}\n","import { execSync } from 'node:child_process';\nimport type { GitContext } from '../types/index.js';\n\nexport function getGitContext(cwd: string): GitContext {\n try {\n const opts = { cwd, encoding: 'utf-8' as const, stdio: ['pipe', 'pipe', 'pipe'] as const };\n const branch = execSync('git rev-parse --abbrev-ref HEAD', opts).trim();\n const commit = execSync('git rev-parse --short HEAD', opts).trim();\n const statusOutput = execSync('git status --porcelain', opts).trim();\n const dirty = statusOutput.length > 0;\n\n return { branch, commit, dirty };\n } catch {\n return { branch: null, commit: null, dirty: null };\n }\n}\n\nexport function getGitDiff(cwd: string, fromCommit: string, toCommit: string, maxSize: number): string | null {\n try {\n const diff = execSync(`git diff ${fromCommit}..${toCommit}`, {\n cwd,\n encoding: 'utf-8',\n maxBuffer: maxSize,\n });\n return diff.length > 0 ? diff.slice(0, maxSize) : null;\n } catch {\n return null;\n }\n}\n","import { sqliteTable, text, integer, real, index, uniqueIndex } from 'drizzle-orm/sqlite-core';\n\nexport const projects = sqliteTable('projects', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n rootPath: text('root_path').notNull().unique(),\n createdAt: text('created_at').notNull(),\n updatedAt: text('updated_at').notNull(),\n});\n\nexport const issues = sqliteTable('issues', {\n id: text('id').primaryKey(),\n projectId: text('project_id').notNull().references(() => projects.id),\n title: text('title').notNull(),\n type: text('type', { enum: ['build', 'runtime', 'test', 'lint', 'unknown'] }).notNull().default('unknown'),\n severity: text('severity', { enum: ['low', 'medium', 'high', 'critical'] }).notNull().default('medium'),\n status: text('status', { enum: ['open', 'resolved', 'ignored'] }).notNull().default('open'),\n signature: text('signature').notNull(),\n occurrenceCount: integer('occurrence_count').notNull().default(1),\n estimatedTotalCost: real('estimated_total_cost').notNull().default(0),\n firstSeenAt: text('first_seen_at').notNull(),\n lastSeenAt: text('last_seen_at').notNull(),\n resolvedAt: text('resolved_at'),\n regressionFlag: integer('regression_flag', { mode: 'boolean' }).notNull().default(false),\n createdAt: text('created_at').notNull(),\n updatedAt: text('updated_at').notNull(),\n}, (table) => [\n uniqueIndex('idx_issues_project_signature').on(table.projectId, table.signature),\n index('idx_issues_project_status').on(table.projectId, table.status),\n]);\n\nexport const occurrences = sqliteTable('occurrences', {\n id: text('id').primaryKey(),\n issueId: text('issue_id').notNull().references(() => issues.id),\n rawLog: text('raw_log').notNull(),\n command: text('command').notNull(),\n exitCode: integer('exit_code'),\n signal: text('signal'),\n durationMs: integer('duration_ms'),\n gitBranch: text('git_branch'),\n gitCommit: text('git_commit'),\n gitDirty: integer('git_dirty', { mode: 'boolean' }),\n appliedDiff: text('applied_diff'),\n estimatedInputTokens: integer('estimated_input_tokens').notNull().default(0),\n estimatedOutputTokens: integer('estimated_output_tokens').notNull().default(0),\n estimatedCost: real('estimated_cost').notNull().default(0),\n capturedFrom: text('captured_from', { enum: ['wrapper', 'stream'] }).notNull().default('wrapper'),\n createdAt: text('created_at').notNull(),\n}, (table) => [\n index('idx_occurrences_issue_created').on(table.issueId, table.createdAt),\n]);\n\nexport const fixAttempts = sqliteTable('fix_attempts', {\n id: text('id').primaryKey(),\n issueId: text('issue_id').notNull().references(() => issues.id),\n summary: text('summary'),\n rootCause: text('root_cause'),\n prevention: text('prevention'),\n successful: integer('successful', { mode: 'boolean' }),\n source: text('source', { enum: ['agent', 'manual', 'api'] }).notNull().default('manual'),\n createdAt: text('created_at').notNull(),\n}, (table) => [\n index('idx_fix_attempts_issue').on(table.issueId),\n]);\n\nexport const runLog = sqliteTable('run_log', {\n id: text('id').primaryKey(),\n projectId: text('project_id').notNull().references(() => projects.id),\n command: text('command').notNull(),\n exitCode: integer('exit_code'),\n durationMs: integer('duration_ms'),\n createdAt: text('created_at').notNull(),\n}, (table) => [\n index('idx_run_log_project_created').on(table.projectId, table.createdAt),\n]);\n","import { join, parse } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { VIBEBUG_DIR, DB_FILENAME } from './constants.js';\n\n/**\n * Walk up from `startDir` looking for a `.vibebug/` directory.\n * Returns the project root (parent of `.vibebug/`) or null.\n */\nexport function findProjectRoot(startDir: string): string | null {\n let dir = startDir;\n const { root } = parse(dir);\n\n while (dir !== root) {\n if (existsSync(join(dir, VIBEBUG_DIR))) {\n return dir;\n }\n dir = join(dir, '..');\n }\n\n return null;\n}\n\nexport function getVibeBugDir(projectRoot: string): string {\n return join(projectRoot, VIBEBUG_DIR);\n}\n\nexport function getDbPath(projectRoot: string): string {\n return join(projectRoot, VIBEBUG_DIR, DB_FILENAME);\n}\n","import Database from 'better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport * as schema from './schema.js';\nimport { getDbPath, getVibeBugDir } from '../utils/paths.js';\nimport { mkdirSync, existsSync } from 'node:fs';\n\nlet cachedDb: ReturnType<typeof drizzle> | null = null;\nlet cachedSqlite: Database.Database | null = null;\n\nexport function getDatabase(projectRoot: string) {\n if (cachedDb) return cachedDb;\n\n const vibebugDir = getVibeBugDir(projectRoot);\n if (!existsSync(vibebugDir)) {\n mkdirSync(vibebugDir, { recursive: true });\n }\n\n const dbPath = getDbPath(projectRoot);\n const sqlite = new Database(dbPath);\n\n // Enable WAL mode for better concurrent read performance\n sqlite.pragma('journal_mode = WAL');\n sqlite.pragma('foreign_keys = ON');\n\n cachedSqlite = sqlite;\n cachedDb = drizzle(sqlite, { schema });\n\n return cachedDb;\n}\n\nexport function closeDatabase(): void {\n if (cachedSqlite) {\n cachedSqlite.close();\n cachedSqlite = null;\n cachedDb = null;\n }\n}\n","import Database from 'better-sqlite3';\nimport { getDbPath, getVibeBugDir } from '../utils/paths.js';\nimport { mkdirSync, existsSync } from 'node:fs';\n\nconst SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS projects (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n root_path TEXT NOT NULL UNIQUE,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS issues (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL REFERENCES projects(id),\n title TEXT NOT NULL,\n type TEXT NOT NULL DEFAULT 'unknown',\n severity TEXT NOT NULL DEFAULT 'medium',\n status TEXT NOT NULL DEFAULT 'open',\n signature TEXT NOT NULL,\n occurrence_count INTEGER NOT NULL DEFAULT 1,\n estimated_total_cost REAL NOT NULL DEFAULT 0,\n first_seen_at TEXT NOT NULL,\n last_seen_at TEXT NOT NULL,\n resolved_at TEXT,\n regression_flag INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_issues_project_signature ON issues(project_id, signature);\nCREATE INDEX IF NOT EXISTS idx_issues_project_status ON issues(project_id, status);\n\nCREATE TABLE IF NOT EXISTS occurrences (\n id TEXT PRIMARY KEY,\n issue_id TEXT NOT NULL REFERENCES issues(id),\n raw_log TEXT NOT NULL,\n command TEXT NOT NULL,\n exit_code INTEGER,\n signal TEXT,\n duration_ms INTEGER,\n git_branch TEXT,\n git_commit TEXT,\n git_dirty INTEGER,\n applied_diff TEXT,\n estimated_input_tokens INTEGER NOT NULL DEFAULT 0,\n estimated_output_tokens INTEGER NOT NULL DEFAULT 0,\n estimated_cost REAL NOT NULL DEFAULT 0,\n captured_from TEXT NOT NULL DEFAULT 'wrapper',\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_occurrences_issue_created ON occurrences(issue_id, created_at);\n\nCREATE TABLE IF NOT EXISTS fix_attempts (\n id TEXT PRIMARY KEY,\n issue_id TEXT NOT NULL REFERENCES issues(id),\n summary TEXT,\n root_cause TEXT,\n prevention TEXT,\n successful INTEGER,\n source TEXT NOT NULL DEFAULT 'manual',\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_fix_attempts_issue ON fix_attempts(issue_id);\n`;\n\nexport function runMigrations(projectRoot: string): void {\n const vibebugDir = getVibeBugDir(projectRoot);\n if (!existsSync(vibebugDir)) {\n mkdirSync(vibebugDir, { recursive: true });\n }\n\n const dbPath = getDbPath(projectRoot);\n const db = new Database(dbPath);\n\n db.pragma('journal_mode = WAL');\n db.pragma('foreign_keys = ON');\n db.exec(SCHEMA_SQL);\n\n // Incremental migrations for existing databases\n try {\n db.exec(`ALTER TABLE fix_attempts ADD COLUMN source TEXT NOT NULL DEFAULT 'manual'`);\n } catch {\n // Column already exists — ignore\n }\n\n // M2: Run log table for adoption telemetry\n db.exec(`\nCREATE TABLE IF NOT EXISTS run_log (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL REFERENCES projects(id),\n command TEXT NOT NULL,\n exit_code INTEGER,\n duration_ms INTEGER,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_run_log_project_created ON run_log(project_id, created_at);\n `);\n\n db.close();\n}\n","import { basename } from 'node:path';\nimport { eq, and, desc, sql } from 'drizzle-orm';\nimport { nanoid } from 'nanoid';\nimport { getDatabase } from './connection.js';\nimport { projects, issues, occurrences, fixAttempts, runLog } from './schema.js';\nimport { runMigrations } from './migrate.js';\nimport type { Project, GitContext } from '../types/index.js';\nimport type { CostEstimate } from '../core/cost-estimator.js';\n\nexport function ensureProject(rootPath: string): Project {\n runMigrations(rootPath);\n\n const db = getDatabase(rootPath);\n const existing = db.select().from(projects).where(eq(projects.rootPath, rootPath)).get();\n\n if (existing) {\n return existing as Project;\n }\n\n const now = new Date().toISOString();\n const project = {\n id: nanoid(),\n name: basename(rootPath),\n rootPath,\n createdAt: now,\n updatedAt: now,\n };\n\n db.insert(projects).values(project).run();\n return project as Project;\n}\n\nexport function findIssueBySignature(projectRoot: string, projectId: string, signature: string) {\n const db = getDatabase(projectRoot);\n return db.select().from(issues)\n .where(and(eq(issues.projectId, projectId), eq(issues.signature, signature)))\n .get();\n}\n\nexport function createIssue(\n projectRoot: string,\n data: {\n projectId: string;\n title: string;\n type: 'build' | 'runtime' | 'test' | 'lint' | 'unknown';\n signature: string;\n estimatedCost: number;\n }\n) {\n const db = getDatabase(projectRoot);\n const now = new Date().toISOString();\n const id = nanoid();\n\n db.insert(issues).values({\n id,\n projectId: data.projectId,\n title: data.title,\n type: data.type,\n severity: 'medium',\n status: 'open',\n signature: data.signature,\n occurrenceCount: 1,\n estimatedTotalCost: data.estimatedCost,\n firstSeenAt: now,\n lastSeenAt: now,\n regressionFlag: false,\n createdAt: now,\n updatedAt: now,\n }).run();\n\n return id;\n}\n\nexport function incrementIssue(\n projectRoot: string,\n issueId: string,\n additionalCost: number,\n wasResolved: boolean,\n) {\n const db = getDatabase(projectRoot);\n const now = new Date().toISOString();\n\n const updateFields: Record<string, unknown> = {\n occurrenceCount: sql`${issues.occurrenceCount} + 1`,\n lastSeenAt: now,\n estimatedTotalCost: sql`${issues.estimatedTotalCost} + ${additionalCost}`,\n updatedAt: now,\n };\n\n if (wasResolved) {\n updateFields.status = 'open';\n updateFields.regressionFlag = true;\n updateFields.resolvedAt = null;\n }\n\n db.update(issues).set(updateFields).where(eq(issues.id, issueId)).run();\n}\n\nexport function createOccurrence(\n projectRoot: string,\n data: {\n issueId: string;\n rawLog: string;\n command: string;\n exitCode: number | null;\n signal: string | null;\n durationMs: number;\n gitContext: GitContext;\n appliedDiff: string | null;\n costEstimate: CostEstimate;\n capturedFrom: 'wrapper' | 'stream';\n }\n) {\n const db = getDatabase(projectRoot);\n const now = new Date().toISOString();\n\n db.insert(occurrences).values({\n id: nanoid(),\n issueId: data.issueId,\n rawLog: data.rawLog,\n command: data.command,\n exitCode: data.exitCode,\n signal: data.signal,\n durationMs: data.durationMs,\n gitBranch: data.gitContext.branch,\n gitCommit: data.gitContext.commit,\n gitDirty: data.gitContext.dirty,\n appliedDiff: data.appliedDiff,\n estimatedInputTokens: data.costEstimate.inputTokens,\n estimatedOutputTokens: data.costEstimate.outputTokens,\n estimatedCost: data.costEstimate.cost,\n capturedFrom: data.capturedFrom,\n createdAt: now,\n }).run();\n}\n\nexport function getOpenIssues(projectRoot: string, projectId: string) {\n const db = getDatabase(projectRoot);\n return db.select().from(issues)\n .where(and(eq(issues.projectId, projectId), eq(issues.status, 'open')))\n .orderBy(desc(issues.lastSeenAt))\n .all();\n}\n\nexport function getAllIssues(projectRoot: string, projectId: string) {\n const db = getDatabase(projectRoot);\n return db.select().from(issues)\n .where(eq(issues.projectId, projectId))\n .orderBy(desc(issues.lastSeenAt))\n .all();\n}\n\nexport function getLastOccurrenceCommit(projectRoot: string, issueId: string): string | null {\n const db = getDatabase(projectRoot);\n const last = db.select({ gitCommit: occurrences.gitCommit })\n .from(occurrences)\n .where(eq(occurrences.issueId, issueId))\n .orderBy(desc(occurrences.createdAt))\n .limit(1)\n .get();\n\n return last?.gitCommit ?? null;\n}\n\nexport function getMostRecentOpenIssue(projectRoot: string, projectId: string) {\n const db = getDatabase(projectRoot);\n return db.select().from(issues)\n .where(and(eq(issues.projectId, projectId), eq(issues.status, 'open')))\n .orderBy(desc(issues.lastSeenAt))\n .limit(1)\n .get();\n}\n\nexport function resolveIssue(projectRoot: string, issueId: string) {\n const db = getDatabase(projectRoot);\n const now = new Date().toISOString();\n db.update(issues).set({\n status: 'resolved',\n resolvedAt: now,\n updatedAt: now,\n }).where(eq(issues.id, issueId)).run();\n}\n\nexport function getIssueById(projectRoot: string, issueId: string) {\n const db = getDatabase(projectRoot);\n return db.select().from(issues).where(eq(issues.id, issueId)).get();\n}\n\nexport function createFixAttempt(\n projectRoot: string,\n data: {\n issueId: string;\n summary?: string;\n rootCause?: string;\n prevention?: string;\n source?: 'agent' | 'manual' | 'api';\n }\n) {\n const db = getDatabase(projectRoot);\n const now = new Date().toISOString();\n const id = nanoid();\n\n db.insert(fixAttempts).values({\n id,\n issueId: data.issueId,\n summary: data.summary ?? null,\n rootCause: data.rootCause ?? null,\n prevention: data.prevention ?? null,\n successful: null,\n source: data.source ?? 'manual',\n createdAt: now,\n }).run();\n\n return id;\n}\n\nexport function logRun(\n projectRoot: string,\n data: {\n projectId: string;\n command: string;\n exitCode: number | null;\n durationMs: number | null;\n }\n) {\n const db = getDatabase(projectRoot);\n db.insert(runLog).values({\n id: nanoid(),\n projectId: data.projectId,\n command: data.command,\n exitCode: data.exitCode,\n durationMs: data.durationMs,\n createdAt: new Date().toISOString(),\n }).run();\n}\n\nexport function getRunStats(projectRoot: string, projectId: string) {\n const db = getDatabase(projectRoot);\n const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD\n\n const todayRuns = db.select({ count: sql<number>`count(*)` })\n .from(runLog)\n .where(and(\n eq(runLog.projectId, projectId),\n sql`${runLog.createdAt} >= ${today}`,\n ))\n .get();\n\n const todayFailures = db.select({ count: sql<number>`count(*)` })\n .from(runLog)\n .where(and(\n eq(runLog.projectId, projectId),\n sql`${runLog.createdAt} >= ${today}`,\n sql`${runLog.exitCode} != 0`,\n ))\n .get();\n\n const totalRuns = db.select({ count: sql<number>`count(*)` })\n .from(runLog)\n .where(eq(runLog.projectId, projectId))\n .get();\n\n return {\n runsToday: todayRuns?.count ?? 0,\n failuresToday: todayFailures?.count ?? 0,\n totalRuns: totalRuns?.count ?? 0,\n };\n}\n","import pc from 'picocolors';\nimport type { CaptureInput, GitContext, Project } from '../types/index.js';\nimport type { ErrorBlock } from './stream-detector.js';\nimport { generateSignature } from './signature.js';\nimport { estimateCost } from './cost-estimator.js';\nimport { getGitDiff } from './git-context.js';\nimport {\n findIssueBySignature,\n createIssue,\n incrementIssue,\n createOccurrence,\n getLastOccurrenceCommit,\n} from '../db/queries.js';\nimport { MAX_DIFF_SIZE, DEFAULT_TAIL_LINES } from '../utils/constants.js';\n\nexport interface StreamCaptureInput {\n project: Project;\n commandStr: string;\n block: ErrorBlock;\n gitContext: GitContext;\n}\n\nexport async function captureFailure(input: CaptureInput): Promise<void> {\n const { project, commandStr, result, gitContext, skipSignatures } = input;\n const fullLog = result.stderr || result.stdout;\n\n if (!fullLog.trim()) return;\n\n // Truncate to last N lines (default 200) for consistent capture\n const rawLog = tailLines(fullLog, DEFAULT_TAIL_LINES);\n const signature = generateSignature(rawLog, commandStr);\n\n // Skip if the stream detector already captured this error\n if (skipSignatures?.has(signature)) return;\n const costEstimate = estimateCost(rawLog.length);\n const issueType = inferType(commandStr);\n\n const existing = findIssueBySignature(project.rootPath, project.id, signature);\n\n let issueId: string;\n let occurrenceCount: number;\n let appliedDiff: string | null = null;\n let isRegression = false;\n\n if (existing) {\n issueId = existing.id;\n const wasResolved = existing.status === 'resolved';\n isRegression = wasResolved;\n\n // Auto diff: capture what changed between last occurrence and now\n if (gitContext.commit) {\n const prevCommit = getLastOccurrenceCommit(project.rootPath, issueId);\n if (prevCommit && prevCommit !== gitContext.commit) {\n appliedDiff = getGitDiff(project.rootPath, prevCommit, gitContext.commit, MAX_DIFF_SIZE);\n }\n }\n\n incrementIssue(project.rootPath, issueId, costEstimate.cost, wasResolved);\n occurrenceCount = existing.occurrenceCount + 1;\n } else {\n const title = extractTitle(rawLog);\n issueId = createIssue(project.rootPath, {\n projectId: project.id,\n title,\n type: issueType,\n signature,\n estimatedCost: costEstimate.cost,\n });\n occurrenceCount = 1;\n }\n\n createOccurrence(project.rootPath, {\n issueId,\n rawLog,\n command: commandStr,\n exitCode: result.exitCode,\n signal: result.signal,\n durationMs: result.durationMs,\n gitContext,\n appliedDiff,\n costEstimate,\n capturedFrom: 'wrapper',\n });\n\n // Print summary\n const title = existing?.title ?? extractTitle(rawLog);\n const shortTitle = title.length > 60 ? title.slice(0, 57) + '...' : title;\n const costStr = formatCost(costEstimate.cost * occurrenceCount);\n const countStr = occurrenceCount > 1 ? ` (seen ${occurrenceCount} times, ~${costStr} in AI fixes)` : '';\n const regressionStr = isRegression ? pc.red(' [REGRESSION]') : '';\n\n console.error(\n `\\n${pc.cyan('[vibebug]')} ${pc.bold(shortTitle)}${countStr}${regressionStr}`\n );\n}\n\nfunction inferType(command: string): 'build' | 'runtime' | 'test' | 'lint' | 'unknown' {\n const lower = command.toLowerCase();\n if (/\\b(build|compile|tsc)\\b/.test(lower)) return 'build';\n if (/\\b(test|jest|vitest|mocha|pytest|cargo test|go test)\\b/.test(lower)) return 'test';\n if (/\\b(lint|eslint|prettier|biome)\\b/.test(lower)) return 'lint';\n if (/\\b(dev|start|serve|run)\\b/.test(lower)) return 'runtime';\n return 'unknown';\n}\n\nfunction extractTitle(rawLog: string): string {\n const lines = rawLog.split('\\n').filter(l => l.trim());\n\n // Look for common error patterns\n for (const line of lines) {\n const stripped = line.replace(/\\x1b\\[[0-9;]*[a-zA-Z]/g, '').trim();\n if (/^(Error|TypeError|ReferenceError|SyntaxError|RangeError):/.test(stripped)) {\n return stripped.slice(0, 200);\n }\n if (/^error(\\[|\\s|:)/i.test(stripped)) {\n return stripped.slice(0, 200);\n }\n if (/Module not found|Cannot find module/.test(stripped)) {\n return stripped.slice(0, 200);\n }\n if (/FAIL|FATAL|panic:/.test(stripped)) {\n return stripped.slice(0, 200);\n }\n }\n\n // Fallback: last non-empty line\n const last = lines.at(-1)?.replace(/\\x1b\\[[0-9;]*[a-zA-Z]/g, '').trim() ?? 'Unknown error';\n return last.slice(0, 200);\n}\n\n/**\n * Capture an error block detected by the stream detector (long-running commands).\n */\nexport function captureStreamError(input: StreamCaptureInput): void {\n const { project, commandStr, block, gitContext } = input;\n const rawLog = block.lines.join('\\n');\n if (!rawLog.trim()) return;\n\n const costEstimate = estimateCost(rawLog.length);\n const issueType = inferType(commandStr);\n\n const existing = findIssueBySignature(project.rootPath, project.id, block.signature);\n\n let issueId: string;\n let occurrenceCount: number;\n let appliedDiff: string | null = null;\n let isRegression = false;\n\n if (existing) {\n issueId = existing.id;\n const wasResolved = existing.status === 'resolved';\n isRegression = wasResolved;\n\n if (gitContext.commit) {\n const prevCommit = getLastOccurrenceCommit(project.rootPath, issueId);\n if (prevCommit && prevCommit !== gitContext.commit) {\n appliedDiff = getGitDiff(project.rootPath, prevCommit, gitContext.commit, MAX_DIFF_SIZE);\n }\n }\n\n incrementIssue(project.rootPath, issueId, costEstimate.cost, wasResolved);\n occurrenceCount = existing.occurrenceCount + 1;\n } else {\n const title = extractTitle(rawLog);\n issueId = createIssue(project.rootPath, {\n projectId: project.id,\n title,\n type: issueType,\n signature: block.signature,\n estimatedCost: costEstimate.cost,\n });\n occurrenceCount = 1;\n }\n\n createOccurrence(project.rootPath, {\n issueId,\n rawLog,\n command: commandStr,\n exitCode: null,\n signal: null,\n durationMs: 0,\n gitContext,\n appliedDiff,\n costEstimate,\n capturedFrom: 'stream',\n });\n\n const title = existing?.title ?? extractTitle(rawLog);\n const shortTitle = title.length > 60 ? title.slice(0, 57) + '...' : title;\n const costStr = formatCost(costEstimate.cost * occurrenceCount);\n const countStr = occurrenceCount > 1 ? ` (seen ${occurrenceCount} times, ~${costStr} in AI fixes)` : '';\n const regressionStr = isRegression ? pc.red(' [REGRESSION]') : '';\n\n console.error(\n `\\n${pc.cyan('[vibebug:stream]')} ${pc.bold(shortTitle)}${countStr}${regressionStr}`\n );\n}\n\nfunction formatCost(cost: number): string {\n if (cost < 0.01) return `$${cost.toFixed(4)}`;\n return `$${cost.toFixed(2)}`;\n}\n\nfunction tailLines(text: string, maxLines: number): string {\n const lines = text.split('\\n');\n if (lines.length <= maxLines) return text;\n return lines.slice(-maxLines).join('\\n');\n}\n","import { generateSignature } from './signature.js';\nimport {\n DEFAULT_STREAM_QUIET_TIMEOUT_MS,\n DEFAULT_STREAM_COOLDOWN_MS,\n MAX_ERROR_BLOCK_LINES,\n} from '../utils/constants.js';\n\n/**\n * Error markers that trigger error block collection.\n */\nconst ERROR_MARKERS = [\n /^(Error|TypeError|ReferenceError|SyntaxError|RangeError|URIError|EvalError):/,\n /^Uncaught /,\n /^Traceback \\(most recent call last\\)/,\n /^panic:/,\n /^FATAL/i,\n /^npm ERR!/,\n /^ERR!/,\n /ELIFECYCLE/,\n /Module not found/,\n /Cannot find module/,\n /Segmentation fault/,\n /error\\[E\\d+\\]/,\n /error TS\\d+/,\n /^ERROR\\s/,\n /CompileError/,\n /Build failed/i,\n /Failed to compile/i,\n];\n\ntype DetectorState = 'idle' | 'collecting';\n\nexport interface ErrorBlock {\n lines: string[];\n signature: string;\n}\n\nexport class StreamDetector {\n private state: DetectorState = 'idle';\n private blockLines: string[] = [];\n private quietTimer: ReturnType<typeof setTimeout> | null = null;\n private recentSignatures: Map<string, number> = new Map(); // signature → timestamp\n private onCapture: (block: ErrorBlock) => void;\n private command: string;\n private quietTimeoutMs: number;\n private cooldownMs: number;\n\n constructor(\n command: string,\n onCapture: (block: ErrorBlock) => void,\n options?: {\n quietTimeoutMs?: number;\n cooldownMs?: number;\n }\n ) {\n this.command = command;\n this.onCapture = onCapture;\n this.quietTimeoutMs = options?.quietTimeoutMs ?? DEFAULT_STREAM_QUIET_TIMEOUT_MS;\n this.cooldownMs = options?.cooldownMs ?? DEFAULT_STREAM_COOLDOWN_MS;\n }\n\n /**\n * Feed a chunk of output to the detector. Call this for each data event\n * from stdout/stderr.\n */\n feed(chunk: string): void {\n const lines = chunk.split('\\n');\n for (const line of lines) {\n this.processLine(line);\n }\n }\n\n /**\n * Call when the process exits to flush any pending error block.\n */\n flush(): void {\n if (this.state === 'collecting' && this.blockLines.length > 0) {\n this.finalizeBlock();\n }\n this.clearQuietTimer();\n }\n\n destroy(): void {\n this.clearQuietTimer();\n }\n\n /**\n * Returns all signatures that were captured by the stream detector.\n */\n getCapturedSignatures(): Set<string> {\n return new Set(this.recentSignatures.keys());\n }\n\n private processLine(line: string): void {\n const stripped = line.replace(/\\x1b\\[[0-9;]*[a-zA-Z]/g, '').trim();\n\n if (this.state === 'idle') {\n if (this.isErrorMarker(stripped)) {\n this.state = 'collecting';\n this.blockLines = [line];\n this.resetQuietTimer();\n }\n } else if (this.state === 'collecting') {\n this.blockLines.push(line);\n this.resetQuietTimer();\n\n // Cap at max lines\n if (this.blockLines.length >= MAX_ERROR_BLOCK_LINES) {\n this.finalizeBlock();\n }\n }\n }\n\n private isErrorMarker(line: string): boolean {\n return ERROR_MARKERS.some(re => re.test(line));\n }\n\n private resetQuietTimer(): void {\n this.clearQuietTimer();\n this.quietTimer = setTimeout(() => {\n if (this.state === 'collecting') {\n this.finalizeBlock();\n }\n }, this.quietTimeoutMs);\n }\n\n private clearQuietTimer(): void {\n if (this.quietTimer) {\n clearTimeout(this.quietTimer);\n this.quietTimer = null;\n }\n }\n\n private finalizeBlock(): void {\n this.clearQuietTimer();\n this.state = 'idle';\n\n const rawBlock = this.blockLines.join('\\n');\n const signature = generateSignature(rawBlock, this.command);\n\n // Cooldown: skip if same signature was captured recently\n const lastSeen = this.recentSignatures.get(signature);\n const now = Date.now();\n if (lastSeen && now - lastSeen < this.cooldownMs) {\n this.blockLines = [];\n return;\n }\n\n this.recentSignatures.set(signature, now);\n\n // Clean up old signatures\n for (const [sig, ts] of this.recentSignatures) {\n if (now - ts > this.cooldownMs * 2) {\n this.recentSignatures.delete(sig);\n }\n }\n\n this.onCapture({ lines: this.blockLines, signature });\n this.blockLines = [];\n }\n}\n","import { runCommand } from '../core/runner.js';\nimport { captureFailure, captureStreamError } from '../core/capture.js';\nimport { getGitContext } from '../core/git-context.js';\nimport { ensureProject, logRun } from '../db/queries.js';\nimport { StreamDetector } from '../core/stream-detector.js';\nimport type { ErrorBlock } from '../core/stream-detector.js';\n\nexport async function wrapCommand(args: string[]): Promise<number> {\n const commandStr = args.join(' ');\n const cwd = process.cwd();\n const project = ensureProject(cwd);\n\n // Set up stream detector for long-running commands\n const detector = new StreamDetector(commandStr, (block: ErrorBlock) => {\n const gitContext = getGitContext(cwd);\n captureStreamError({\n project,\n commandStr,\n block,\n gitContext,\n });\n });\n\n const result = await runCommand(args, (chunk) => {\n detector.feed(chunk);\n });\n\n // Flush any pending error block from the detector\n detector.flush();\n detector.destroy();\n\n // Log every run for adoption telemetry (success or failure)\n logRun(cwd, {\n projectId: project.id,\n command: commandStr,\n exitCode: result.exitCode,\n durationMs: result.durationMs,\n });\n\n // Also capture on non-zero exit (the standard path)\n // Skip if the stream detector already captured the same error\n if (result.exitCode !== 0) {\n const gitContext = getGitContext(cwd);\n await captureFailure({\n project,\n commandStr,\n result,\n gitContext,\n skipSignatures: detector.getCapturedSignatures(),\n });\n }\n\n return result.exitCode ?? 1;\n}\n","import pc from 'picocolors';\nimport { existsSync, appendFileSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { ensureProject } from '../db/queries.js';\nimport { VIBEBUG_DIR } from '../utils/constants.js';\n\nexport async function initCommand(): Promise<void> {\n const cwd = process.cwd();\n const vibebugDir = join(cwd, VIBEBUG_DIR);\n\n if (existsSync(vibebugDir)) {\n console.log(pc.yellow('VibeBug is already initialized in this project.'));\n return;\n }\n\n // This creates .vibebug/, runs migrations, and inserts the project row\n const project = ensureProject(cwd);\n\n // Add .vibebug/ to .gitignore\n const gitignorePath = join(cwd, '.gitignore');\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8');\n if (!content.includes(VIBEBUG_DIR)) {\n appendFileSync(gitignorePath, `\\n# VibeBug local data\\n${VIBEBUG_DIR}/\\n`);\n console.log(pc.dim(`Added ${VIBEBUG_DIR}/ to .gitignore`));\n }\n }\n\n console.log(pc.green(`VibeBug initialized for \"${project.name}\".`));\n console.log();\n console.log('Quick start:');\n console.log(` ${pc.cyan('vb')} npm run build Run a command with failure capture`);\n console.log(` ${pc.cyan('vb list')} View captured issues`);\n console.log(` ${pc.cyan('vb dash')} Open the dashboard`);\n}\n","import pc from 'picocolors';\nimport { ensureProject, getAllIssues } from '../db/queries.js';\n\nexport async function listCommand(): Promise<void> {\n const cwd = process.cwd();\n const project = ensureProject(cwd);\n const issueList = getAllIssues(cwd, project.id);\n\n // Project header\n console.log();\n console.log(pc.bold(project.name) + pc.dim(` ${cwd}`));\n\n if (issueList.length === 0) {\n console.log(pc.dim('No issues captured yet. Run commands with `vb` to start tracking.'));\n return;\n }\n\n console.log();\n console.log(\n pc.dim(\n pad('ID', 8) +\n pad('Title', 45) +\n pad('Type', 10) +\n pad('Status', 10) +\n pad('Seen', 6) +\n pad('Cost', 10) +\n 'Last seen'\n )\n );\n console.log(pc.dim('─'.repeat(110)));\n\n for (const issue of issueList) {\n const title = issue.title.length > 42 ? issue.title.slice(0, 39) + '...' : issue.title;\n const cost = formatCost(issue.estimatedTotalCost);\n const lastSeen = timeAgo(issue.lastSeenAt);\n const statusColor = issue.status === 'open' ? pc.yellow : issue.status === 'resolved' ? pc.green : pc.dim;\n const severityColor = issue.severity === 'critical' ? pc.red :\n issue.severity === 'high' ? pc.yellow :\n issue.severity === 'medium' ? pc.white : pc.dim;\n const regression = issue.regressionFlag ? pc.red(' !') : '';\n\n console.log(\n pad(issue.id.slice(0, 7), 8) +\n severityColor(pad(title, 45)) +\n pad(issue.type, 10) +\n statusColor(pad(issue.status, 10)) +\n pad(String(issue.occurrenceCount), 6) +\n pad(cost, 10) +\n lastSeen +\n regression\n );\n }\n\n console.log();\n console.log(pc.dim(`${issueList.length} issue(s) total`));\n}\n\nfunction pad(str: string, width: number): string {\n return str.padEnd(width);\n}\n\nfunction formatCost(cost: number): string {\n if (cost === 0) return '-';\n if (cost < 0.01) return `$${cost.toFixed(4)}`;\n return `$${cost.toFixed(2)}`;\n}\n\nfunction timeAgo(isoStr: string): string {\n const diff = Date.now() - new Date(isoStr).getTime();\n const seconds = Math.floor(diff / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n","import { Hono } from 'hono';\nimport { eq, and, desc, sql, like, count as drizzleCount } from 'drizzle-orm';\nimport { nanoid } from 'nanoid';\nimport { getDatabase } from '../../db/connection.js';\nimport { projects, issues, occurrences, fixAttempts, runLog } from '../../db/schema.js';\n\nexport function createApiRoutes(projectRoot: string) {\n const api = new Hono();\n const db = getDatabase(projectRoot);\n\n // Get project info\n api.get('/project', (c) => {\n const project = db.select().from(projects)\n .where(eq(projects.rootPath, projectRoot))\n .get();\n if (!project) return c.json({ error: 'Project not found' }, 404);\n return c.json(project);\n });\n\n // Get overview stats\n api.get('/stats', (c) => {\n const project = db.select().from(projects)\n .where(eq(projects.rootPath, projectRoot))\n .get();\n if (!project) return c.json({ error: 'Project not found' }, 404);\n\n const totalIssues = db.select({ count: sql<number>`count(*)` })\n .from(issues)\n .where(eq(issues.projectId, project.id))\n .get()?.count ?? 0;\n\n const openIssues = db.select({ count: sql<number>`count(*)` })\n .from(issues)\n .where(and(eq(issues.projectId, project.id), eq(issues.status, 'open')))\n .get()?.count ?? 0;\n\n const resolvedIssues = db.select({ count: sql<number>`count(*)` })\n .from(issues)\n .where(and(eq(issues.projectId, project.id), eq(issues.status, 'resolved')))\n .get()?.count ?? 0;\n\n const totalOccurrences = db.select({ count: sql<number>`count(*)` })\n .from(occurrences)\n .innerJoin(issues, eq(occurrences.issueId, issues.id))\n .where(eq(issues.projectId, project.id))\n .get()?.count ?? 0;\n\n const totalEstimatedCost = db.select({ total: sql<number>`coalesce(sum(${issues.estimatedTotalCost}), 0)` })\n .from(issues)\n .where(eq(issues.projectId, project.id))\n .get()?.total ?? 0;\n\n const regressions = db.select({ count: sql<number>`count(*)` })\n .from(issues)\n .where(and(eq(issues.projectId, project.id), eq(issues.regressionFlag, true)))\n .get()?.count ?? 0;\n\n // Severity distribution\n const severityDist = db.select({\n severity: issues.severity,\n count: sql<number>`count(*)`,\n })\n .from(issues)\n .where(eq(issues.projectId, project.id))\n .groupBy(issues.severity)\n .all();\n\n // Type distribution\n const typeDist = db.select({\n type: issues.type,\n count: sql<number>`count(*)`,\n })\n .from(issues)\n .where(eq(issues.projectId, project.id))\n .groupBy(issues.type)\n .all();\n\n // Occurrences per day (last 30 days)\n const occurrencesPerDay = db.select({\n date: sql<string>`date(${occurrences.createdAt})`,\n count: sql<number>`count(*)`,\n })\n .from(occurrences)\n .innerJoin(issues, eq(occurrences.issueId, issues.id))\n .where(and(\n eq(issues.projectId, project.id),\n sql`${occurrences.createdAt} >= datetime('now', '-30 days')`\n ))\n .groupBy(sql`date(${occurrences.createdAt})`)\n .orderBy(sql`date(${occurrences.createdAt})`)\n .all();\n\n // Run telemetry\n const today = new Date().toISOString().slice(0, 10);\n const runsToday = db.select({ count: sql<number>`count(*)` })\n .from(runLog)\n .where(and(\n eq(runLog.projectId, project.id),\n sql`${runLog.createdAt} >= ${today}`,\n ))\n .get()?.count ?? 0;\n\n const failuresToday = db.select({ count: sql<number>`count(*)` })\n .from(runLog)\n .where(and(\n eq(runLog.projectId, project.id),\n sql`${runLog.createdAt} >= ${today}`,\n sql`${runLog.exitCode} != 0`,\n ))\n .get()?.count ?? 0;\n\n const totalRuns = db.select({ count: sql<number>`count(*)` })\n .from(runLog)\n .where(eq(runLog.projectId, project.id))\n .get()?.count ?? 0;\n\n return c.json({\n totalIssues,\n openIssues,\n resolvedIssues,\n totalOccurrences,\n totalEstimatedCost,\n regressions,\n severityDistribution: severityDist,\n typeDistribution: typeDist,\n occurrencesPerDay,\n runsToday,\n failuresToday,\n totalRuns,\n });\n });\n\n // List issues\n api.get('/issues', (c) => {\n const project = db.select().from(projects)\n .where(eq(projects.rootPath, projectRoot))\n .get();\n if (!project) return c.json({ error: 'Project not found' }, 404);\n\n const status = c.req.query('status');\n const type = c.req.query('type');\n const severity = c.req.query('severity');\n const search = c.req.query('search');\n const sortBy = c.req.query('sort') ?? 'lastSeenAt';\n\n let conditions = [eq(issues.projectId, project.id)];\n if (status) conditions.push(eq(issues.status, status as 'open' | 'resolved' | 'ignored'));\n if (type) conditions.push(eq(issues.type, type as 'build' | 'runtime' | 'test' | 'lint' | 'unknown'));\n if (severity) conditions.push(eq(issues.severity, severity as 'low' | 'medium' | 'high' | 'critical'));\n if (search) conditions.push(like(issues.title, `%${search}%`));\n\n const orderCol = sortBy === 'occurrences' ? desc(issues.occurrenceCount) :\n sortBy === 'cost' ? desc(issues.estimatedTotalCost) :\n sortBy === 'severity' ? desc(issues.severity) :\n desc(issues.lastSeenAt);\n\n const result = db.select().from(issues)\n .where(and(...conditions))\n .orderBy(orderCol)\n .all();\n\n return c.json(result);\n });\n\n // Get issue detail\n api.get('/issues/:id', (c) => {\n const issueId = c.req.param('id');\n const issue = db.select().from(issues)\n .where(eq(issues.id, issueId))\n .get();\n if (!issue) return c.json({ error: 'Issue not found' }, 404);\n\n const issueOccurrences = db.select().from(occurrences)\n .where(eq(occurrences.issueId, issueId))\n .orderBy(desc(occurrences.createdAt))\n .all();\n\n const fixes = db.select().from(fixAttempts)\n .where(eq(fixAttempts.issueId, issueId))\n .orderBy(desc(fixAttempts.createdAt))\n .all();\n\n return c.json({ ...issue, occurrences: issueOccurrences, fixAttempts: fixes });\n });\n\n // Update issue status\n api.patch('/issues/:id', async (c) => {\n const issueId = c.req.param('id');\n const body = await c.req.json<{ status?: string; severity?: string }>();\n const now = new Date().toISOString();\n\n const updateFields: Record<string, unknown> = { updatedAt: now };\n if (body.status) {\n updateFields.status = body.status;\n if (body.status === 'resolved') updateFields.resolvedAt = now;\n if (body.status === 'open') updateFields.resolvedAt = null;\n }\n if (body.severity) updateFields.severity = body.severity;\n\n db.update(issues).set(updateFields).where(eq(issues.id, issueId)).run();\n const updated = db.select().from(issues).where(eq(issues.id, issueId)).get();\n return c.json(updated);\n });\n\n // Create fix attempt and resolve issue (agent-friendly endpoint)\n api.post('/issues/:id/fix', async (c) => {\n const issueId = c.req.param('id');\n\n const issue = db.select().from(issues)\n .where(eq(issues.id, issueId))\n .get();\n if (!issue) return c.json({ error: 'Issue not found' }, 404);\n\n const body = await c.req.json<{\n summary?: string;\n rootCause?: string;\n prevention?: string;\n source?: 'agent' | 'manual' | 'api';\n }>();\n\n const now = new Date().toISOString();\n const fixId = nanoid();\n const source = body.source ?? 'api';\n\n // Insert fix attempt\n db.insert(fixAttempts).values({\n id: fixId,\n issueId,\n summary: body.summary ?? null,\n rootCause: body.rootCause ?? null,\n prevention: body.prevention ?? null,\n successful: null,\n source,\n createdAt: now,\n }).run();\n\n // Resolve the issue\n db.update(issues).set({\n status: 'resolved',\n resolvedAt: now,\n updatedAt: now,\n }).where(eq(issues.id, issueId)).run();\n\n // Return updated issue with fix attempts\n const updated = db.select().from(issues).where(eq(issues.id, issueId)).get();\n const fixes = db.select().from(fixAttempts)\n .where(eq(fixAttempts.issueId, issueId))\n .orderBy(desc(fixAttempts.createdAt))\n .all();\n\n return c.json({ ...updated, fixAttempts: fixes }, 201);\n });\n\n // Get insights\n api.get('/insights', (c) => {\n const project = db.select().from(projects)\n .where(eq(projects.rootPath, projectRoot))\n .get();\n if (!project) return c.json({ error: 'Project not found' }, 404);\n\n // Top recurring issues (by occurrence count)\n const topRecurring = db.select().from(issues)\n .where(eq(issues.projectId, project.id))\n .orderBy(desc(issues.occurrenceCount))\n .limit(10)\n .all();\n\n // Most expensive issues (by estimated cost)\n const mostExpensive = db.select().from(issues)\n .where(eq(issues.projectId, project.id))\n .orderBy(desc(issues.estimatedTotalCost))\n .limit(10)\n .all();\n\n // Regressions\n const regressionIssues = db.select().from(issues)\n .where(and(eq(issues.projectId, project.id), eq(issues.regressionFlag, true)))\n .orderBy(desc(issues.lastSeenAt))\n .all();\n\n // Most failing commands\n const failingCommands = db.select({\n command: occurrences.command,\n count: sql<number>`count(*)`,\n })\n .from(occurrences)\n .innerJoin(issues, eq(occurrences.issueId, issues.id))\n .where(eq(issues.projectId, project.id))\n .groupBy(occurrences.command)\n .orderBy(desc(sql`count(*)`))\n .limit(10)\n .all();\n\n return c.json({\n topRecurring,\n mostExpensive,\n regressions: regressionIssues,\n failingCommands,\n });\n });\n\n return api;\n}\n","import { Hono } from 'hono';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport { createApiRoutes } from './routes/api.js';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport function createServer(projectRoot: string) {\n const app = new Hono();\n\n // API routes\n const api = createApiRoutes(projectRoot);\n app.route('/api', api);\n\n // Serve dashboard static files\n const staticRoot = join(__dirname, '..', 'static');\n app.use('/*', serveStatic({ root: staticRoot }));\n\n // SPA fallback: serve index.html for any non-API, non-asset route\n app.get('*', serveStatic({ root: staticRoot, path: 'index.html' }));\n\n return app;\n}\n","import pc from 'picocolors';\nimport { serve } from '@hono/node-server';\nimport { createServer } from '../server/index.js';\nimport { ensureProject } from '../db/queries.js';\nimport { DEFAULT_DASHBOARD_PORT } from '../utils/constants.js';\n\nexport async function dashCommand(options: { port?: string; open?: boolean }): Promise<void> {\n const cwd = process.cwd();\n const project = ensureProject(cwd);\n\n const port = parseInt(options.port ?? String(DEFAULT_DASHBOARD_PORT), 10);\n const app = createServer(cwd);\n\n const server = serve({\n fetch: app.fetch,\n port,\n }, (info) => {\n const url = `http://localhost:${info.port}`;\n console.log(pc.green(`VibeBug dashboard running at ${pc.bold(url)}`));\n console.log(pc.dim(`Project: ${project.name} (${cwd})`));\n console.log(pc.dim('Press Ctrl+C to stop.\\n'));\n\n // Auto-open browser\n if (options.open !== false) {\n import('open').then(({ default: open }) => open(url)).catch(() => {});\n }\n });\n\n // Keep process alive\n await new Promise(() => {});\n}\n","import pc from 'picocolors';\nimport { input, select } from '@inquirer/prompts';\nimport { findProjectRoot } from '../utils/paths.js';\nimport {\n ensureProject,\n getOpenIssues,\n getIssueById,\n getMostRecentOpenIssue,\n resolveIssue,\n createFixAttempt,\n} from '../db/queries.js';\n\nexport async function fixCommand(\n issueId: string | undefined,\n options: {\n last?: boolean;\n summary?: string;\n rootCause?: string;\n prevention?: string;\n json?: boolean;\n }\n): Promise<void> {\n const cwd = process.cwd();\n const projectRoot = findProjectRoot(cwd);\n\n if (!projectRoot) {\n console.error(pc.red('No VibeBug project found. Run `vb init` first.'));\n process.exit(1);\n }\n\n const project = ensureProject(projectRoot);\n\n let targetIssue;\n\n if (options.last) {\n // Target the most recent open issue\n targetIssue = getMostRecentOpenIssue(projectRoot, project.id);\n if (!targetIssue) {\n console.log(pc.yellow('No open issues found.'));\n return;\n }\n } else if (issueId) {\n // Target a specific issue by ID (supports partial match)\n targetIssue = getIssueById(projectRoot, issueId);\n if (!targetIssue) {\n // Try partial match\n const allOpen = getOpenIssues(projectRoot, project.id);\n targetIssue = allOpen.find(i => i.id.startsWith(issueId));\n if (!targetIssue) {\n console.error(pc.red(`Issue \"${issueId}\" not found.`));\n return;\n }\n }\n } else {\n // Interactive: let user pick from open issues\n const openIssues = getOpenIssues(projectRoot, project.id);\n if (openIssues.length === 0) {\n console.log(pc.yellow('No open issues found.'));\n return;\n }\n\n const answer = await select({\n message: 'Which issue did you fix?',\n choices: openIssues.map(issue => ({\n name: `${issue.id.slice(0, 7)} ${issue.title.slice(0, 60)} (${issue.occurrenceCount}x)`,\n value: issue.id,\n })),\n });\n\n targetIssue = openIssues.find(i => i.id === answer)!;\n }\n\n // Determine if running non-interactively (agent mode)\n const isNonInteractive = !!options.summary;\n let summary = options.summary;\n let rootCause: string | undefined = options.rootCause;\n let prevention: string | undefined = options.prevention;\n\n if (!isNonInteractive) {\n // Interactive mode — ask for details\n summary = await input({\n message: 'Fix summary (what you changed):',\n });\n\n rootCause = await input({\n message: 'Root cause (optional):',\n }) || undefined;\n\n prevention = await input({\n message: 'Prevention (how to avoid in the future, optional):',\n }) || undefined;\n }\n\n const source = isNonInteractive ? 'agent' : 'manual';\n\n // Create fix attempt and resolve the issue\n createFixAttempt(projectRoot, {\n issueId: targetIssue.id,\n summary,\n rootCause,\n prevention,\n source,\n });\n\n resolveIssue(projectRoot, targetIssue.id);\n\n if (options.json) {\n // Machine-readable output for agents\n console.log(JSON.stringify({\n status: 'resolved',\n issueId: targetIssue.id,\n title: targetIssue.title,\n fixSummary: summary,\n }));\n } else {\n const shortTitle = targetIssue.title.length > 50\n ? targetIssue.title.slice(0, 47) + '...'\n : targetIssue.title;\n\n console.log(pc.green(`Resolved: ${pc.bold(shortTitle)}`));\n if (summary) {\n console.log(pc.dim(` Fix: ${summary}`));\n }\n }\n}\n","import pc from 'picocolors';\nimport { writeFileSync } from 'node:fs';\nimport { findProjectRoot } from '../utils/paths.js';\nimport { ensureProject, getAllIssues } from '../db/queries.js';\nimport { getDatabase } from '../db/connection.js';\nimport { occurrences, fixAttempts } from '../db/schema.js';\nimport { eq, desc } from 'drizzle-orm';\n\nexport async function exportCommand(options: {\n format?: string;\n output?: string;\n}): Promise<void> {\n const cwd = process.cwd();\n const projectRoot = findProjectRoot(cwd);\n\n if (!projectRoot) {\n console.error(pc.red('No VibeBug project found. Run `vb init` first.'));\n process.exit(1);\n }\n\n const project = ensureProject(projectRoot);\n const allIssues = getAllIssues(projectRoot, project.id);\n\n if (allIssues.length === 0) {\n console.log(pc.yellow('No issues to export.'));\n return;\n }\n\n const format = options.format ?? 'json';\n\n if (format === 'json') {\n const db = getDatabase(projectRoot);\n const data = allIssues.map(issue => {\n const issueOccurrences = db.select().from(occurrences)\n .where(eq(occurrences.issueId, issue.id))\n .orderBy(desc(occurrences.createdAt))\n .all();\n const fixes = db.select().from(fixAttempts)\n .where(eq(fixAttempts.issueId, issue.id))\n .orderBy(desc(fixAttempts.createdAt))\n .all();\n return { ...issue, occurrences: issueOccurrences, fixAttempts: fixes };\n });\n\n const json = JSON.stringify({ project, issues: data }, null, 2);\n\n if (options.output) {\n writeFileSync(options.output, json, 'utf-8');\n console.log(pc.green(`Exported ${allIssues.length} issues to ${options.output}`));\n } else {\n process.stdout.write(json + '\\n');\n }\n } else if (format === 'csv') {\n const header = 'id,title,type,severity,status,occurrences,estimated_cost,first_seen,last_seen,regression';\n const rows = allIssues.map(issue =>\n [\n issue.id,\n `\"${issue.title.replace(/\"/g, '\"\"')}\"`,\n issue.type,\n issue.severity,\n issue.status,\n issue.occurrenceCount,\n issue.estimatedTotalCost.toFixed(4),\n issue.firstSeenAt,\n issue.lastSeenAt,\n issue.regressionFlag ? 'true' : 'false',\n ].join(',')\n );\n\n const csv = [header, ...rows].join('\\n');\n\n if (options.output) {\n writeFileSync(options.output, csv, 'utf-8');\n console.log(pc.green(`Exported ${allIssues.length} issues to ${options.output}`));\n } else {\n process.stdout.write(csv + '\\n');\n }\n } else {\n console.error(pc.red(`Unknown format: \"${format}\". Use \"json\" or \"csv\".`));\n }\n}\n","import pc from 'picocolors';\nimport { readFileSync, writeFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { findProjectRoot } from '../utils/paths.js';\nimport { VIBEBUG_DIR } from '../utils/constants.js';\n\nconst CONFIG_FILE = 'config.json';\n\nconst VALID_KEYS: Record<string, { type: 'string' | 'number'; description: string }> = {\n aiModel: { type: 'string', description: 'AI model for cost estimation (claude-sonnet, claude-opus, claude-haiku, gpt-4o)' },\n aiInputPricePerMToken: { type: 'number', description: 'Custom input price per million tokens' },\n aiOutputPricePerMToken: { type: 'number', description: 'Custom output price per million tokens' },\n estimatedOutputTokens: { type: 'number', description: 'Heuristic for AI response size (default: 1000)' },\n ringBufferSize: { type: 'number', description: 'Ring buffer size in bytes (default: 204800)' },\n streamQuietTimeout: { type: 'number', description: 'Stream quiet timeout in ms (default: 2000)' },\n streamCooldown: { type: 'number', description: 'Stream cooldown in ms (default: 60000)' },\n dashboardPort: { type: 'number', description: 'Dashboard port (default: 7600)' },\n autoOpen: { type: 'string', description: 'Auto-open dashboard in browser (true/false)' },\n};\n\nfunction getConfigPath(projectRoot: string): string {\n return join(projectRoot, VIBEBUG_DIR, CONFIG_FILE);\n}\n\nfunction readConfig(projectRoot: string): Record<string, unknown> {\n const configPath = getConfigPath(projectRoot);\n if (!existsSync(configPath)) return {};\n try {\n return JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nfunction writeConfig(projectRoot: string, config: Record<string, unknown>): void {\n const configPath = getConfigPath(projectRoot);\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\nexport async function configCommand(action: string, key?: string, value?: string): Promise<void> {\n const cwd = process.cwd();\n const projectRoot = findProjectRoot(cwd);\n\n if (!projectRoot) {\n console.error(pc.red('No VibeBug project found. Run `vb init` first.'));\n process.exit(1);\n }\n\n const config = readConfig(projectRoot);\n\n switch (action) {\n case 'get': {\n if (key) {\n const val = config[key];\n if (val !== undefined) {\n console.log(`${key} = ${val}`);\n } else {\n console.log(pc.dim(`${key} is not set`));\n }\n } else {\n // Show all config\n if (Object.keys(config).length === 0) {\n console.log(pc.dim('No configuration set. Using defaults.'));\n } else {\n for (const [k, v] of Object.entries(config)) {\n console.log(`${k} = ${v}`);\n }\n }\n }\n break;\n }\n case 'set': {\n if (!key || value === undefined) {\n console.error(pc.red('Usage: vb config set <key> <value>'));\n return;\n }\n\n const spec = VALID_KEYS[key];\n if (!spec) {\n console.error(pc.red(`Unknown config key: \"${key}\"`));\n console.log(pc.dim('Valid keys:'));\n for (const [k, v] of Object.entries(VALID_KEYS)) {\n console.log(pc.dim(` ${k} — ${v.description}`));\n }\n return;\n }\n\n let parsed: unknown = value;\n if (spec.type === 'number') {\n parsed = Number(value);\n if (Number.isNaN(parsed as number)) {\n console.error(pc.red(`\"${value}\" is not a valid number.`));\n return;\n }\n }\n\n config[key] = parsed;\n writeConfig(projectRoot, config);\n console.log(pc.green(`Set ${key} = ${parsed}`));\n break;\n }\n case 'list': {\n console.log(pc.bold('Available configuration keys:\\n'));\n for (const [k, v] of Object.entries(VALID_KEYS)) {\n const current = config[k];\n const currentStr = current !== undefined ? pc.cyan(` (current: ${current})`) : '';\n console.log(` ${pc.bold(k)}${currentStr}`);\n console.log(` ${pc.dim(v.description)}`);\n }\n break;\n }\n default:\n console.error(pc.red(`Unknown action: \"${action}\". Use \"get\", \"set\", or \"list\".`));\n }\n}\n","import { Command } from 'commander';\nimport { VERSION, APP_NAME } from './utils/constants.js';\n\nconst KNOWN_COMMANDS = ['init', 'list', 'dash', 'fix', 'export', 'config', 'help'];\n\n// Check if the first arg is a known subcommand or flag\nconst firstArg = process.argv[2];\nconst isSubcommand = firstArg && (KNOWN_COMMANDS.includes(firstArg) || firstArg.startsWith('-'));\n\nif (!isSubcommand && firstArg) {\n // Treat everything after `vb` as a command to wrap\n const args = process.argv.slice(2);\n import('./commands/wrap.js').then(async ({ wrapCommand }) => {\n const exitCode = await wrapCommand(args);\n process.exitCode = exitCode;\n });\n} else {\n // Parse as a normal CLI with subcommands\n const program = new Command();\n\n program\n .name(APP_NAME)\n .description('Automatic issue capture for vibe coding failures — without interrupting flow.')\n .version(VERSION);\n\n program\n .command('init')\n .description('Initialize VibeBug for the current project')\n .action(async () => {\n const { initCommand } = await import('./commands/init.js');\n await initCommand();\n });\n\n program\n .command('list')\n .description('List open issues for the current project')\n .action(async () => {\n const { listCommand } = await import('./commands/list.js');\n await listCommand();\n });\n\n program\n .command('dash')\n .description('Launch the local dashboard')\n .option('--port <port>', 'Dashboard port', String(7600))\n .option('--no-open', 'Do not auto-open browser')\n .action(async (options) => {\n const { dashCommand } = await import('./commands/dash.js');\n await dashCommand(options);\n });\n\n program\n .command('fix [issueId]')\n .description('Record what fixed an issue (retroactive annotation)')\n .option('--last', 'Target the most recent open issue')\n .option('--summary <text>', 'Fix summary (what was changed)')\n .option('--root-cause <text>', 'Root cause of the issue')\n .option('--prevention <text>', 'How to prevent in the future')\n .option('--json', 'Output result as JSON (for agent consumption)')\n .action(async (issueId, options) => {\n const { fixCommand } = await import('./commands/fix.js');\n await fixCommand(issueId, options);\n });\n\n program\n .command('export')\n .description('Export issues to JSON or CSV')\n .option('--format <format>', 'Output format (json or csv)', 'json')\n .option('-o, --output <file>', 'Write to file instead of stdout')\n .action(async (options) => {\n const { exportCommand } = await import('./commands/export.js');\n await exportCommand(options);\n });\n\n program\n .command('config <action> [key] [value]')\n .description('Manage VibeBug configuration')\n .action(async (action, key, value) => {\n const { configCommand } = await import('./commands/config.js');\n await configCommand(action, key, value);\n });\n\n program.parse();\n}\n"],"mappings":"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","names":["input","existsSync","Database","mkdirSync","existsSync","input","title","text","pc","existsSync","join","pc","formatCost","eq","and","desc","sql","nanoid","Hono","join","pc","pc","pc","eq","desc","pc","readFileSync","writeFileSync","existsSync","join","wrapCommand","initCommand","listCommand","dashCommand","fixCommand","exportCommand","configCommand"]}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "vibebug",
3
+ "version": "0.1.0",
4
+ "description": "Automatic issue capture for vibe coding failures — without interrupting flow.",
5
+ "type": "module",
6
+ "bin": {
7
+ "vb": "./dist/index.js",
8
+ "vibebug": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist/",
12
+ "static/",
13
+ "drizzle/"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsup",
17
+ "dev": "tsup --watch",
18
+ "test": "vitest run",
19
+ "clean": "rm -rf dist"
20
+ },
21
+ "dependencies": {
22
+ "@hono/node-server": "^1.14.0",
23
+ "@inquirer/prompts": "^7.5.0",
24
+ "better-sqlite3": "^11.9.0",
25
+ "commander": "^13.1.0",
26
+ "drizzle-orm": "^0.39.0",
27
+ "hono": "^4.7.0",
28
+ "nanoid": "^5.1.0",
29
+ "open": "^10.1.0",
30
+ "picocolors": "^1.1.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/better-sqlite3": "^7.6.0",
34
+ "@types/node": "^22.0.0",
35
+ "drizzle-kit": "^0.30.0",
36
+ "tsup": "^8.4.0",
37
+ "vitest": "^3.0.0"
38
+ },
39
+ "keywords": ["vibe-coding", "error-tracking", "developer-tools", "cli"],
40
+ "license": "MIT"
41
+ }
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-cyan-400:oklch(78.9% .154 211.53);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.5rem;--radius-lg:.75rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-background:#f8f8fc;--color-foreground:#1a1625;--color-card:#fff;--color-card-foreground:#1a1625;--color-primary:#7c5cfc;--color-primary-foreground:#fff;--color-secondary-foreground:#65607a;--color-muted:#f0eef5;--color-muted-foreground:#8a8698;--color-border:#e4e0ed;--color-ring:#7c5cfc;--color-danger:#ef4444;--color-warning:#f59e0b;--color-success:#22c55e}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.top-0{top:calc(var(--spacing) * 0)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-2{top:calc(var(--spacing) * 2)}.bottom-2{bottom:calc(var(--spacing) * 2)}.left-0{left:calc(var(--spacing) * 0)}.left-\[-15px\]{left:-15px}.left-\[9px\]{left:9px}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-\[2px\]{height:2px}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-full{width:100%}.w-px{width:1px}.max-w-\[240px\]{max-width:240px}.max-w-\[1140px\]{max-width:1140px}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--color-border)}.border-card{border-color:var(--color-card)}.border-success\/20{border-color:#22c55e33}@supports (color:color-mix(in lab,red,red)){.border-success\/20{border-color:color-mix(in oklab,var(--color-success) 20%,transparent)}}.bg-background{background-color:var(--color-background)}.bg-border{background-color:var(--color-border)}.bg-card{background-color:var(--color-card)}.bg-danger{background-color:var(--color-danger)}.bg-danger\/10{background-color:#ef44441a}@supports (color:color-mix(in lab,red,red)){.bg-danger\/10{background-color:color-mix(in oklab,var(--color-danger) 10%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted-foreground{background-color:var(--color-muted-foreground)}.bg-primary{background-color:var(--color-primary)}.bg-primary\/10{background-color:#7c5cfc1a}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-success{background-color:var(--color-success)}.bg-success\/5{background-color:#22c55e0d}@supports (color:color-mix(in lab,red,red)){.bg-success\/5{background-color:color-mix(in oklab,var(--color-success) 5%,transparent)}}.bg-success\/10{background-color:#22c55e1a}@supports (color:color-mix(in lab,red,red)){.bg-success\/10{background-color:color-mix(in oklab,var(--color-success) 10%,transparent)}}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--color-warning)}.bg-warning\/10{background-color:#f59e0b1a}@supports (color:color-mix(in lab,red,red)){.bg-warning\/10{background-color:color-mix(in oklab,var(--color-warning) 10%,transparent)}}.p-0{padding:calc(var(--spacing) * 0)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pb-0{padding-bottom:calc(var(--spacing) * 0)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-card-foreground{color:var(--color-card-foreground)}.text-cyan-400{color:var(--color-cyan-400)}.text-danger{color:var(--color-danger)}.text-foreground{color:var(--color-foreground)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-success{color:var(--color-success)}.text-warning{color:var(--color-warning)}.uppercase{text-transform:uppercase}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.group-hover\:text-primary:is(:where(.group):hover *){color:var(--color-primary)}}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}@media(hover:hover){.hover\:bg-danger\/20:hover{background-color:#ef444433}@supports (color:color-mix(in lab,red,red)){.hover\:bg-danger\/20:hover{background-color:color-mix(in oklab,var(--color-danger) 20%,transparent)}}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:bg-muted\/50:hover{background-color:#f0eef580}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.hover\:bg-primary\/90:hover{background-color:#7c5cfce6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--color-primary) 90%,transparent)}}.hover\:bg-success\/20:hover{background-color:#22c55e33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-success\/20:hover{background-color:color-mix(in oklab,var(--color-success) 20%,transparent)}}.hover\:bg-warning\/20:hover{background-color:#f59e0b33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/20:hover{background-color:color-mix(in oklab,var(--color-warning) 20%,transparent)}}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-primary\/80:hover{color:#7c5cfccc}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,var(--color-primary) 80%,transparent)}}.hover\:text-secondary-foreground:hover{color:var(--color-secondary-foreground)}}.focus-visible\:border-primary\/50:focus-visible{border-color:#7c5cfc80}@supports (color:color-mix(in lab,red,red)){.focus-visible\:border-primary\/50:focus-visible{border-color:color-mix(in oklab,var(--color-primary) 50%,transparent)}}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-primary\/20:focus-visible{--tw-ring-color:#7c5cfc33}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-primary\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:calc(var(--spacing) * 0)}}.dark{--color-background:#0a0a0f;--color-foreground:#e8e6f0;--color-card:#12121a;--color-card-foreground:#e8e6f0;--color-primary:#7c5cfc;--color-primary-foreground:#fff;--color-secondary:#1a1a25;--color-secondary-foreground:#8a8698;--color-muted:#1a1a25;--color-muted-foreground:#5a5670;--color-accent:#7c5cfc;--color-accent-foreground:#fff;--color-border:#1e1e2e;--color-border-subtle:#16161f;--color-input:#1e1e2e;--color-ring:#7c5cfc;--color-danger:#f43f5e;--color-warning:#f59e0b;--color-success:#22c55e;--color-chart-axis:#5a5670}body{background:var(--color-background);color:var(--color-foreground);-webkit-font-smoothing:antialiased;font-family:-apple-system,BlinkMacSystemFont,Inter,Segoe UI,sans-serif}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--color-muted-foreground)}pre{scrollbar-width:thin;scrollbar-color:var(--color-border) transparent}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}