explain-my-error 1.0.10 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -724,11 +724,34 @@ Input modes:
724
724
  3) Pipe from files/commands
725
725
  $ cat error.txt | explain-my-error
726
726
  $ pnpm run build 2>&1 | eme
727
+
728
+ Power features:
729
+ - Context-aware analysis: pass stack traces, code snippets, runtime, and framework.
730
+ - Structured output: use --json for machine-readable responses.
731
+ - Auto framework detection: best-effort detection from local package.json.
727
732
  `
728
733
  );
729
734
  program.command("explain").description("Explain a programming error message").argument("[error...]", "Error message to analyze").option("--json", "Output structured JSON").option("--stack <stackTrace>", "Additional stack trace context").option("--stack-file <path>", "Read stack trace from a file").option("--code <codeSnippet>", "Additional code snippet context").option("--code-file <path>", "Read code snippet from a file").option("--runtime <runtime>", "Runtime context (example: node 20, bun 1.1)").option("--framework <framework>", "Framework context (example: react, nextjs, express)").addHelpText(
730
735
  "after",
731
736
  `
737
+ Context options:
738
+ --stack inline stack trace text
739
+ --stack-file file path for stack trace
740
+ --code inline code snippet text
741
+ --code-file file path for code snippet
742
+ --runtime runtime label (default: current Node version)
743
+ --framework framework label (auto-detected when possible)
744
+
745
+ Output modes:
746
+ default pretty output includes:
747
+ - likely root cause
748
+ - 2-3 hypotheses with confidence
749
+ - ranked fix plans (fast/proper/long-term) with tradeoffs
750
+ - framework-specific recipes
751
+ - remediation commands and verify checklist
752
+
753
+ --json output includes the same data in machine-readable JSON.
754
+
732
755
  Examples:
733
756
  $ explain-my-error explain "SyntaxError: Unexpected token }"
734
757
  $ eme explain "Module not found: Can't resolve 'axios'"
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli-entry.ts","../src/cli.ts","../src/commands/explain.ts","../src/services/ai.ts","../src/types/error.ts","../src/utils/formatter.ts","../src/utils/logger.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { runCli } from \"./cli.js\";\n\nrunCli().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : \"Unexpected CLI failure\";\n process.stderr.write(`${message}\\n`);\n process.exit(1);\n});\n","import { access, readFile, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { type ExplainCommandOptions, runExplainCommand } from \"./commands/explain.js\";\nimport type { ExplainContext } from \"./types/error.js\";\nimport { logger } from \"./utils/logger.js\";\n\nconst require = createRequire(import.meta.url);\n\nfunction getCliVersion(): string {\n try {\n const pkg = require(\"../package.json\") as { version?: string };\n return pkg.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n return \"\";\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\").trim();\n}\n\nasync function safeReadText(filePath: string | undefined): Promise<string | undefined> {\n if (!filePath) {\n return undefined;\n }\n try {\n return await readFile(filePath, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\nasync function detectFrameworkFromPackageJson(): Promise<string | undefined> {\n try {\n const raw = await readFile(\"package.json\", \"utf8\");\n const pkg = JSON.parse(raw) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n if (\"next\" in deps) return \"Next.js\";\n if (\"react\" in deps) return \"React\";\n if (\"express\" in deps) return \"Express\";\n if (\"typescript\" in deps) return \"TypeScript\";\n if (\"fastify\" in deps) return \"Fastify\";\n if (\"nestjs\" in deps || \"@nestjs/core\" in deps) return \"NestJS\";\n } catch {\n // Best-effort auto-detection.\n }\n return undefined;\n}\n\ntype ExplainCliOptions = {\n json?: boolean;\n stack?: string;\n stackFile?: string;\n code?: string;\n codeFile?: string;\n runtime?: string;\n framework?: string;\n};\n\nasync function buildExplainOptions(options: ExplainCliOptions): Promise<ExplainCommandOptions> {\n const stackFromFile = await safeReadText(options.stackFile);\n const codeFromFile = await safeReadText(options.codeFile);\n const detectedFramework = await detectFrameworkFromPackageJson();\n\n const context: ExplainContext = {\n stackTrace: options.stack ?? stackFromFile,\n codeSnippet: options.code ?? codeFromFile,\n runtime: options.runtime ?? `Node ${process.version}`,\n framework: options.framework ?? detectedFramework ?? \"unknown\",\n };\n\n return {\n output: options.json ? \"json\" : \"pretty\",\n context,\n };\n}\n\nasync function promptForError(): Promise<string> {\n if (!process.stdin.isTTY) {\n return \"\";\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n logger.info(pc.cyan(\"Paste an error message and press Enter.\"));\n logger.info(pc.dim('Example: TypeError: Cannot read property \"map\" of undefined'));\n while (true) {\n const answer = await rl.question(pc.bold(pc.cyan(\"\\n> Error message: \")));\n const trimmed = answer.trim();\n\n if (trimmed) {\n return trimmed;\n }\n\n logger.warn(\"Error message cannot be empty. Please try again.\");\n }\n } finally {\n rl.close();\n }\n}\n\nasync function upsertEnvVar(filePath: string, key: string, value: string): Promise<void> {\n let existing = \"\";\n try {\n await access(filePath);\n existing = await readFile(filePath, \"utf8\");\n } catch {\n existing = \"\";\n }\n\n const envLine = `${key}=${value}`;\n const keyPattern = new RegExp(`^${key}=.*$`, \"m\");\n let nextContent: string;\n\n if (keyPattern.test(existing)) {\n nextContent = existing.replace(keyPattern, envLine);\n } else if (!existing.trim()) {\n nextContent = `${envLine}\\n`;\n } else {\n const needsTrailingNewline = !existing.endsWith(\"\\n\");\n nextContent = `${existing}${needsTrailingNewline ? \"\\n\" : \"\"}${envLine}\\n`;\n }\n\n await writeFile(filePath, nextContent, \"utf8\");\n}\n\nasync function ensureGroqApiKey(): Promise<boolean> {\n if (process.env.GROQ_API_KEY?.trim()) {\n return true;\n }\n\n if (!process.stdin.isTTY) {\n return false;\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n logger.warn(\"GROQ_API_KEY is missing.\");\n logger.info(pc.cyan(\"Paste your Groq API key to continue.\"));\n\n while (true) {\n const key = (await rl.question(pc.bold(pc.cyan(\"\\n> GROQ_API_KEY: \")))).trim();\n if (!key) {\n logger.warn(\"API key cannot be empty. Please try again.\");\n continue;\n }\n\n process.env.GROQ_API_KEY = key;\n\n const saveAnswer = (\n await rl.question(pc.dim(\"Save this key to .env in current directory? (Y/n): \"))\n )\n .trim()\n .toLowerCase();\n const shouldSave = saveAnswer === \"\" || saveAnswer === \"y\" || saveAnswer === \"yes\";\n\n if (shouldSave) {\n try {\n await upsertEnvVar(\".env\", \"GROQ_API_KEY\", key);\n logger.success(\"Saved GROQ_API_KEY to .env\");\n } catch {\n logger.warn(\"Could not save key to .env, but this session will continue.\");\n }\n }\n\n return true;\n }\n } finally {\n rl.close();\n }\n}\n\ntype CliLogger = {\n warn(message: string): void;\n};\n\ntype RunCliDeps = {\n runExplain?: (errorMessage: string, options?: ExplainCommandOptions) => Promise<void>;\n readStdin?: () => Promise<string>;\n promptForError?: () => Promise<string>;\n stdinIsTTY?: () => boolean;\n ensureApiKey?: () => Promise<boolean>;\n log?: CliLogger;\n};\n\nexport async function runCli(argv: string[] = process.argv, deps: RunCliDeps = {}): Promise<void> {\n const runExplain = deps.runExplain ?? runExplainCommand;\n const readStdinFn = deps.readStdin ?? readStdin;\n const promptForErrorFn = deps.promptForError ?? promptForError;\n const stdinIsTTY = deps.stdinIsTTY ?? (() => Boolean(process.stdin.isTTY));\n const ensureApiKeyFn =\n deps.ensureApiKey ?? (deps.runExplain ? async () => true : ensureGroqApiKey);\n const log = deps.log ?? logger;\n\n const program = new Command();\n\n program\n .name(\"explain-my-error\")\n .description(\"Explain programming errors with AI\")\n .version(getCliVersion())\n .addHelpText(\n \"after\",\n `\nInput modes:\n 1) Interactive (default)\n $ explain-my-error\n $ eme\n\n 2) Inline argument\n $ explain-my-error explain \"TypeError: Cannot read property 'map' of undefined\"\n $ eme explain \"ReferenceError: x is not defined\"\n\n 3) Pipe from files/commands\n $ cat error.txt | explain-my-error\n $ pnpm run build 2>&1 | eme\n`,\n );\n\n program\n .command(\"explain\")\n .description(\"Explain a programming error message\")\n .argument(\"[error...]\", \"Error message to analyze\")\n .option(\"--json\", \"Output structured JSON\")\n .option(\"--stack <stackTrace>\", \"Additional stack trace context\")\n .option(\"--stack-file <path>\", \"Read stack trace from a file\")\n .option(\"--code <codeSnippet>\", \"Additional code snippet context\")\n .option(\"--code-file <path>\", \"Read code snippet from a file\")\n .option(\"--runtime <runtime>\", \"Runtime context (example: node 20, bun 1.1)\")\n .option(\"--framework <framework>\", \"Framework context (example: react, nextjs, express)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ explain-my-error explain \"SyntaxError: Unexpected token }\"\n $ eme explain \"Module not found: Can't resolve 'axios'\"\n $ cat error.txt | explain-my-error explain\n $ eme explain \"TypeError: Cannot read property 'map' of undefined\" --framework react --runtime \"node 20\"\n $ eme explain --stack-file ./error.log --code-file ./src/app.ts --json\n`,\n )\n .action(async (errorParts: string[], options: ExplainCliOptions) => {\n const inlineError = errorParts.join(\" \").trim();\n const pipedError = inlineError ? \"\" : await readStdinFn();\n const promptedError = !inlineError && !pipedError ? await promptForErrorFn() : \"\";\n const finalError = inlineError || pipedError || promptedError;\n const explainOptions = await buildExplainOptions(options);\n const hasApiKey = await ensureApiKeyFn();\n if (!hasApiKey) {\n log.warn(\"GROQ_API_KEY is required. Set it and run again.\");\n return;\n }\n await runExplain(finalError, explainOptions);\n });\n\n program.action(async () => {\n if (stdinIsTTY()) {\n const promptedError = await promptForErrorFn();\n await runExplain(promptedError, await buildExplainOptions({}));\n return;\n }\n\n const pipedError = await readStdinFn();\n if (!pipedError) {\n log.warn('No input detected. Use: explain-my-error explain \"<error message>\"');\n return;\n }\n\n const hasApiKey = await ensureApiKeyFn();\n if (!hasApiKey) {\n log.warn(\"GROQ_API_KEY is required. Set it and run again.\");\n return;\n }\n\n await runExplain(pipedError, await buildExplainOptions({}));\n });\n\n await program.parseAsync(argv);\n}\n","import ora from \"ora\";\nimport { explainErrorWithAI } from \"../services/ai.js\";\nimport type { ExplainContext, ExplainedError } from \"../types/error.js\";\nimport { formatExplainedError } from \"../utils/formatter.js\";\nimport { logger } from \"../utils/logger.js\";\n\ntype SpinnerLike = {\n succeed(text: string): void;\n fail(text: string): void;\n};\n\ntype ExplainLogger = {\n info(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n};\n\ntype RunExplainDeps = {\n explainError?: (errorMessage: string, context?: ExplainContext) => Promise<ExplainedError>;\n createSpinner?: (text: string) => SpinnerLike;\n formatOutput?: (result: ExplainedError) => string;\n log?: ExplainLogger;\n};\n\nexport type ExplainCommandOptions = {\n output: \"pretty\" | \"json\";\n context?: ExplainContext;\n};\n\nfunction isDepsObject(value: unknown): value is RunExplainDeps {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n return (\n \"explainError\" in candidate ||\n \"createSpinner\" in candidate ||\n \"formatOutput\" in candidate ||\n \"log\" in candidate\n );\n}\n\nexport async function runExplainCommand(\n errorMessage: string,\n optionsOrDeps: ExplainCommandOptions | RunExplainDeps = { output: \"pretty\" },\n depsArg: RunExplainDeps = {},\n): Promise<void> {\n const options = isDepsObject(optionsOrDeps) ? { output: \"pretty\" as const } : optionsOrDeps;\n const deps = isDepsObject(optionsOrDeps) ? optionsOrDeps : depsArg;\n\n const explainError = deps.explainError ?? explainErrorWithAI;\n const createSpinner = deps.createSpinner ?? ((text: string) => ora(text).start());\n const formatOutput = deps.formatOutput ?? formatExplainedError;\n const log = deps.log ?? logger;\n\n if (!errorMessage?.trim()) {\n log.warn(\"Please provide an error message.\");\n return;\n }\n\n const spinner = createSpinner(\"Analyzing your error...\");\n\n try {\n const result = await explainError(errorMessage.trim(), options.context);\n spinner.succeed(\"Explanation ready.\");\n log.info(\"\");\n if (options.output === \"json\") {\n log.info(JSON.stringify(result, null, 2));\n } else {\n log.info(formatOutput(result));\n }\n } catch (error) {\n spinner.fail(\"Could not explain this error.\");\n const message = error instanceof Error ? error.message : \"Unknown error\";\n log.error(message);\n }\n}\n","import axios from \"axios\";\nimport { type ExplainContext, type ExplainedError, explainedErrorSchema } from \"../types/error.js\";\n\nconst GROQ_API_URL = \"https://api.groq.com/openai/v1/chat/completions\";\nconst PRIMARY_GROQ_MODEL = \"llama3-70b-8192\";\nconst FALLBACK_GROQ_MODEL = process.env.GROQ_FALLBACK_MODEL ?? \"llama-3.3-70b-versatile\";\n\ntype GroqChatResponse = {\n choices?: Array<{ message?: { content?: string } }>;\n};\n\nfunction extractJson(content: string): unknown {\n const trimmed = content.trim();\n\n const tryParse = (input: string): unknown | null => {\n try {\n return JSON.parse(input);\n } catch {\n return null;\n }\n };\n\n const sanitizeControlCharsInStrings = (input: string): string => {\n let result = \"\";\n let inString = false;\n let escaping = false;\n\n for (let i = 0; i < input.length; i += 1) {\n const ch = input[i];\n\n if (!inString) {\n result += ch;\n if (ch === '\"') {\n inString = true;\n }\n continue;\n }\n\n if (escaping) {\n result += ch;\n escaping = false;\n continue;\n }\n\n if (ch === \"\\\\\") {\n result += ch;\n escaping = true;\n continue;\n }\n\n if (ch === '\"') {\n result += ch;\n inString = false;\n continue;\n }\n\n if (ch === \"\\n\") {\n result += \"\\\\n\";\n continue;\n }\n if (ch === \"\\r\") {\n result += \"\\\\r\";\n continue;\n }\n if (ch === \"\\t\") {\n result += \"\\\\t\";\n continue;\n }\n\n const code = ch.charCodeAt(0);\n if (code < 0x20) {\n result += `\\\\u${code.toString(16).padStart(4, \"0\")}`;\n continue;\n }\n\n result += ch;\n }\n\n return result;\n };\n\n const direct = tryParse(trimmed);\n if (direct !== null) {\n return direct;\n }\n\n const match = trimmed.match(/\\{[\\s\\S]*\\}/);\n if (!match) {\n throw new Error(\"AI did not return valid JSON.\");\n }\n\n const extracted = match[0];\n const extractedParsed = tryParse(extracted);\n if (extractedParsed !== null) {\n return extractedParsed;\n }\n\n const sanitized = sanitizeControlCharsInStrings(extracted);\n const sanitizedParsed = tryParse(sanitized);\n if (sanitizedParsed !== null) {\n return sanitizedParsed;\n }\n\n throw new Error(\"AI did not return valid JSON.\");\n}\n\nfunction stringifyField(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => stringifyField(item))\n .map((item) => item.trim())\n .filter(Boolean);\n }\n return stringifyField(value)\n .split(/\\n|,/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction toConfidence(value: unknown): number {\n if (typeof value === \"number\") {\n return Math.max(0, Math.min(1, value));\n }\n const parsed = Number(stringifyField(value));\n if (!Number.isNaN(parsed)) {\n return Math.max(0, Math.min(1, parsed));\n }\n return 0.5;\n}\n\nfunction normalizeResponseShape(payload: unknown): unknown {\n if (!payload || typeof payload !== \"object\") {\n return payload;\n }\n\n const data = payload as Record<string, unknown>;\n\n const commonCauses = toStringArray(data.common_causes);\n\n const hypothesesRaw = Array.isArray(data.hypotheses) ? data.hypotheses : [];\n const hypotheses = hypothesesRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n hypothesis: stringifyField(row?.hypothesis),\n confidence: toConfidence(row?.confidence),\n why: stringifyField(row?.why),\n };\n })\n .filter((item) => item.hypothesis && item.why)\n .slice(0, 3);\n\n const fixPlansRaw = Array.isArray(data.fix_plans) ? data.fix_plans : [];\n const normalizedFixPlans = fixPlansRaw\n .map((item, index) => {\n const row = item as Record<string, unknown>;\n const defaultPlan = index === 0 ? \"fast_patch\" : index === 1 ? \"proper_fix\" : \"long_term_fix\";\n const planText = stringifyField(row?.plan || defaultPlan).toLowerCase();\n const plan =\n planText === \"fast_patch\" || planText === \"proper_fix\" || planText === \"long_term_fix\"\n ? planText\n : defaultPlan;\n\n const tradeoffs = (row?.tradeoffs ?? {}) as Record<string, unknown>;\n return {\n plan,\n summary: stringifyField(row?.summary),\n steps: toStringArray(row?.steps),\n tradeoffs: {\n risk: stringifyField(tradeoffs.risk || \"Unknown\"),\n performance: stringifyField(tradeoffs.performance || \"Unknown\"),\n maintainability: stringifyField(tradeoffs.maintainability || \"Unknown\"),\n },\n };\n })\n .filter((item) => item.summary && item.steps.length > 0);\n\n const fixPlans =\n normalizedFixPlans.length >= 3\n ? normalizedFixPlans.slice(0, 3)\n : [\n {\n plan: \"fast_patch\",\n summary: stringifyField(data.fix),\n steps: [stringifyField(data.fix) || \"Apply a defensive guard around the failing line.\"],\n tradeoffs: {\n risk: \"May hide deeper data contract issues.\",\n performance: \"Minimal runtime overhead.\",\n maintainability: \"Good short-term, revisit for root-cause cleanup.\",\n },\n },\n {\n plan: \"proper_fix\",\n summary: \"Fix data flow and initialization path.\",\n steps: [\n \"Trace where the failing value is created.\",\n \"Initialize value before usage and add proper null checks.\",\n \"Add a regression test for this scenario.\",\n ],\n tradeoffs: {\n risk: \"Moderate code changes.\",\n performance: \"Neutral to slightly improved.\",\n maintainability: \"Better long-term readability and reliability.\",\n },\n },\n {\n plan: \"long_term_fix\",\n summary: \"Enforce stronger contracts and prevention tooling.\",\n steps: [\n \"Enable stricter type checks and lint rules.\",\n \"Introduce runtime validation for external inputs.\",\n \"Create reusable utility guards in shared modules.\",\n ],\n tradeoffs: {\n risk: \"Requires broader refactor.\",\n performance: \"Potential minor validation overhead.\",\n maintainability: \"Highest long-term stability.\",\n },\n },\n ];\n\n const frameworkRecipesRaw = Array.isArray(data.framework_recipes) ? data.framework_recipes : [];\n const frameworkRecipes = frameworkRecipesRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n framework: stringifyField(row?.framework),\n when_to_use: stringifyField(row?.when_to_use),\n steps: toStringArray(row?.steps),\n code_snippet: stringifyField(row?.code_snippet),\n };\n })\n .filter(\n (item) => item.framework && item.when_to_use && item.steps.length > 0 && item.code_snippet,\n );\n\n const remediationBlocksRaw = Array.isArray(data.remediation_blocks)\n ? data.remediation_blocks\n : [];\n const remediationBlocks = remediationBlocksRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n title: stringifyField(row?.title),\n commands: toStringArray(row?.commands),\n snippet: stringifyField(row?.snippet) || undefined,\n };\n })\n .filter((item) => item.title && item.commands.length > 0);\n\n const verifyChecklist = toStringArray(data.verify_checklist);\n\n const title = stringifyField(data.title);\n const explanation = stringifyField(data.explanation);\n const codeExample = stringifyField(data.code_example);\n const fix = stringifyField(data.fix);\n const likelyRootCause =\n stringifyField(data.likely_root_cause) ||\n commonCauses[0] ||\n \"Insufficient context from error text.\";\n\n return {\n title: title || \"Unknown error\",\n explanation: explanation || \"Unable to derive explanation from model response.\",\n common_causes:\n commonCauses.length > 0 ? commonCauses : [\"Insufficient context in provided error text.\"],\n fix: fix || \"Add guards and trace value initialization before the failing line.\",\n code_example: codeExample || \"// Add null checks around the failing line.\",\n eli5: stringifyField(data.eli5) || \"Your code expected one thing, but got something different.\",\n likely_root_cause: likelyRootCause,\n hypotheses:\n hypotheses.length > 0\n ? hypotheses\n : [\n {\n hypothesis: likelyRootCause,\n confidence: 0.6,\n why: \"Derived from error pattern and available context.\",\n },\n ],\n fix_plans: fixPlans,\n framework_recipes:\n frameworkRecipes.length > 0\n ? frameworkRecipes\n : [\n {\n framework: \"Node.js\",\n when_to_use: \"Default runtime fallback when framework is unknown.\",\n steps: [\n \"Validate all external data before use.\",\n \"Guard nullable values before method calls.\",\n \"Add test coverage for this failure path.\",\n ],\n code_snippet: \"const safeValue = input ?? defaultValue;\",\n },\n ],\n remediation_blocks:\n remediationBlocks.length > 0\n ? remediationBlocks\n : [\n {\n title: \"Quick remediation commands\",\n commands: [\"npm run test\", \"npm run lint\"],\n },\n ],\n verify_checklist:\n verifyChecklist.length > 0\n ? verifyChecklist\n : [\"Re-run failing command.\", \"Confirm no regression in related flows.\"],\n };\n}\n\nexport async function explainErrorWithAI(\n errorMessage: string,\n context: ExplainContext = {},\n): Promise<ExplainedError> {\n const apiKey = process.env.GROQ_API_KEY;\n if (!apiKey) {\n throw new Error(\n [\n \"Missing GROQ_API_KEY environment variable.\",\n \"\",\n \"Quick setup:\",\n \" macOS/Linux (zsh/bash):\",\n ' export GROQ_API_KEY=\"your_groq_api_key\"',\n \"\",\n \" Windows PowerShell:\",\n ' $env:GROQ_API_KEY=\"your_groq_api_key\"',\n \"\",\n \"Then run the CLI again.\",\n ].join(\"\\n\"),\n );\n }\n\n const prompt = `You are a senior software engineer helping debug errors with context.\nReturn STRICT JSON only (no markdown) with fields:\n- title\n- explanation\n- common_causes (string[])\n- fix\n- code_example\n- eli5\n- likely_root_cause\n- hypotheses (2-3 items): [{ hypothesis, confidence (0..1), why }]\n- fix_plans (exactly 3): [\n { plan: \"fast_patch\", summary, steps[], tradeoffs: { risk, performance, maintainability } },\n { plan: \"proper_fix\", summary, steps[], tradeoffs: { risk, performance, maintainability } },\n { plan: \"long_term_fix\", summary, steps[], tradeoffs: { risk, performance, maintainability } }\n]\n- framework_recipes (1+): [{ framework, when_to_use, steps[], code_snippet }]\n- remediation_blocks (1+): [{ title, commands[], snippet? }]\n- verify_checklist (string[])\n\nUse provided runtime/framework/code/stack context to produce context-aware likely root cause and framework-specific fixes.`;\n\n const contextBlock = [\n `Error message:\\n${errorMessage}`,\n `Runtime:\\n${context.runtime ?? \"unknown\"}`,\n `Framework:\\n${context.framework ?? \"unknown\"}`,\n `Stack trace:\\n${context.stackTrace ?? \"not provided\"}`,\n `Code snippet:\\n${context.codeSnippet ?? \"not provided\"}`,\n ].join(\"\\n\\n\");\n\n const requestBody = {\n messages: [\n { role: \"system\" as const, content: prompt },\n {\n role: \"user\" as const,\n content: `${contextBlock}\\n\\nReturn strict JSON only.`,\n },\n ],\n temperature: 0.2,\n };\n\n const requestConfig = {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n timeout: 30000,\n };\n\n let response: { data?: GroqChatResponse };\n try {\n response = await axios.post(\n GROQ_API_URL,\n { model: PRIMARY_GROQ_MODEL, ...requestBody },\n requestConfig,\n );\n } catch (error) {\n if (axios.isAxiosError(error)) {\n const providerMessage =\n typeof error.response?.data?.error?.message === \"string\"\n ? error.response.data.error.message\n : error.message;\n\n const isModelDecommissioned =\n providerMessage.toLowerCase().includes(\"decommissioned\") ||\n providerMessage.toLowerCase().includes(\"no longer supported\");\n\n if (isModelDecommissioned) {\n response = await axios.post(\n GROQ_API_URL,\n { model: FALLBACK_GROQ_MODEL, ...requestBody },\n requestConfig,\n );\n } else {\n throw new Error(`Groq API request failed: ${providerMessage}`);\n }\n } else {\n throw error;\n }\n }\n\n const content = response.data?.choices?.[0]?.message?.content;\n if (typeof content !== \"string\" || !content.trim()) {\n throw new Error(\"AI response was empty.\");\n }\n\n const parsed = extractJson(content);\n const normalized = normalizeResponseShape(parsed);\n return explainedErrorSchema.parse(normalized);\n}\n","import { z } from \"zod\";\n\nexport const hypothesisSchema = z.object({\n hypothesis: z.string().min(1),\n confidence: z.number().min(0).max(1),\n why: z.string().min(1),\n});\n\nexport const fixPlanSchema = z.object({\n plan: z.enum([\"fast_patch\", \"proper_fix\", \"long_term_fix\"]),\n summary: z.string().min(1),\n steps: z.array(z.string().min(1)).min(1),\n tradeoffs: z.object({\n risk: z.string().min(1),\n performance: z.string().min(1),\n maintainability: z.string().min(1),\n }),\n});\n\nexport const frameworkRecipeSchema = z.object({\n framework: z.string().min(1),\n when_to_use: z.string().min(1),\n steps: z.array(z.string().min(1)).min(1),\n code_snippet: z.string().min(1),\n});\n\nexport const remediationBlockSchema = z.object({\n title: z.string().min(1),\n commands: z.array(z.string().min(1)).min(1),\n snippet: z.string().optional(),\n});\n\nexport const explainedErrorSchema = z.object({\n title: z.string().min(1),\n explanation: z.string().min(1),\n common_causes: z.array(z.string().min(1)).min(1),\n fix: z.string().min(1),\n code_example: z.string().min(1),\n eli5: z.string().min(1),\n likely_root_cause: z.string().min(1),\n hypotheses: z.array(hypothesisSchema).min(1).max(3),\n fix_plans: z.array(fixPlanSchema).min(3),\n framework_recipes: z.array(frameworkRecipeSchema).min(1),\n remediation_blocks: z.array(remediationBlockSchema).min(1),\n verify_checklist: z.array(z.string().min(1)).min(1),\n});\n\nexport type ExplainedError = z.infer<typeof explainedErrorSchema>;\nexport type ExplainHypothesis = z.infer<typeof hypothesisSchema>;\nexport type FixPlan = z.infer<typeof fixPlanSchema>;\nexport type FrameworkRecipe = z.infer<typeof frameworkRecipeSchema>;\nexport type RemediationBlock = z.infer<typeof remediationBlockSchema>;\n\nexport type ExplainContext = {\n stackTrace?: string;\n codeSnippet?: string;\n runtime?: string;\n framework?: string;\n};\n","import pc from \"picocolors\";\nimport type { ExplainedError } from \"../types/error.js\";\n\nconst CARD_WIDTH = 72;\n\nfunction line(char = \"-\"): string {\n return char.repeat(CARD_WIDTH);\n}\n\nfunction pad(text: string): string {\n return text.length > CARD_WIDTH - 4 ? `${text.slice(0, CARD_WIDTH - 7)}...` : text;\n}\n\nfunction framedLine(text: string): string {\n return `| ${pad(text).padEnd(CARD_WIDTH - 4)} |`;\n}\n\nfunction block(title: string, body: string): string {\n const rows = body.split(\"\\n\").map((row) => pc.white(row));\n return [pc.cyan(line()), pc.bold(pc.cyan(title)), ...rows, pc.cyan(line())].join(\"\\n\");\n}\n\nfunction list(items: string[]): string {\n return items.map((item, index) => `${index + 1}. ${item}`).join(\"\\n\");\n}\n\nexport function formatExplainedError(result: ExplainedError): string {\n const commonCauses = list(result.common_causes);\n const hypotheses = result.hypotheses\n .map(\n (item, index) =>\n `${index + 1}. ${item.hypothesis}\\n confidence: ${(item.confidence * 100).toFixed(0)}%\\n why: ${item.why}`,\n )\n .join(\"\\n\\n\");\n const fixPlans = result.fix_plans\n .map((plan) => {\n const label =\n plan.plan === \"fast_patch\"\n ? \"Fast Patch\"\n : plan.plan === \"proper_fix\"\n ? \"Proper Fix\"\n : \"Long-Term Fix\";\n return [\n `${pc.bold(pc.green(label))}: ${plan.summary}`,\n ...plan.steps.map((step, index) => ` ${index + 1}. ${step}`),\n ` tradeoffs -> risk: ${plan.tradeoffs.risk}; performance: ${plan.tradeoffs.performance}; maintainability: ${plan.tradeoffs.maintainability}`,\n ].join(\"\\n\");\n })\n .join(\"\\n\\n\");\n const frameworkRecipes = result.framework_recipes\n .map((recipe) =>\n [\n `${pc.bold(pc.cyan(recipe.framework))}: ${recipe.when_to_use}`,\n ...recipe.steps.map((step, index) => ` ${index + 1}. ${step}`),\n \" snippet:\",\n recipe.code_snippet\n .split(\"\\n\")\n .map((lineText) => ` ${lineText}`)\n .join(\"\\n\"),\n ].join(\"\\n\"),\n )\n .join(\"\\n\\n\");\n const remediationBlocks = result.remediation_blocks\n .map((blockItem) => {\n const snippet = blockItem.snippet?.trim()\n ? `\\n snippet:\\n${blockItem.snippet\n .split(\"\\n\")\n .map((lineText) => ` ${lineText}`)\n .join(\"\\n\")}`\n : \"\";\n return (\n [\n `${pc.bold(pc.green(blockItem.title))}`,\n ...blockItem.commands.map((command) => ` $ ${command}`),\n ].join(\"\\n\") + snippet\n );\n })\n .join(\"\\n\\n\");\n const verifyChecklist = list(result.verify_checklist);\n const hero = [\n pc.cyan(line(\"=\")),\n framedLine(pc.bold(pc.cyan(\"EXPLAIN MY ERROR\"))),\n framedLine(pc.dim(\"AI powered debugging for humans\")),\n pc.cyan(line(\"=\")),\n ].join(\"\\n\");\n\n return [\n hero,\n \"\",\n `${pc.bold(pc.cyan(\"ERROR\"))}: ${pc.bold(pc.white(result.title))}`,\n `${pc.bold(pc.yellow(\"LIKELY ROOT CAUSE\"))}: ${pc.white(result.likely_root_cause)}`,\n \"\",\n block(\"EXPLANATION\", result.explanation),\n \"\",\n block(\"COMMON CAUSES\", commonCauses),\n \"\",\n block(\"HYPOTHESES (WITH CONFIDENCE)\", hypotheses),\n \"\",\n block(\"RANKED FIX PLANS\", fixPlans),\n \"\",\n `${pc.bold(pc.green(\"FIX\"))}\\n${pc.white(result.fix)}`,\n \"\",\n block(\"CODE EXAMPLE\", result.code_example),\n \"\",\n block(\"FRAMEWORK-SPECIFIC RECIPES\", frameworkRecipes),\n \"\",\n block(\"COPY-PASTE REMEDIATION\", remediationBlocks),\n \"\",\n block(\"VERIFY CHECKLIST\", verifyChecklist),\n \"\",\n block(\"ELI5\", result.eli5),\n \"\",\n pc.dim('Tip: run `eme explain \"<error>\"` for quick mode.'),\n ].join(\"\\n\");\n}\n","import pc from \"picocolors\";\n\nexport const logger = {\n info(message: string): void {\n process.stdout.write(`${pc.white(message)}\\n`);\n },\n success(message: string): void {\n process.stdout.write(`${pc.green(`OK: ${message}`)}\\n`);\n },\n warn(message: string): void {\n process.stderr.write(`${pc.yellow(`WARN: ${message}`)}\\n`);\n },\n error(message: string): void {\n process.stderr.write(`${pc.red(`ERROR: ${message}`)}\\n`);\n },\n};\n"],"mappings":"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","names":["pc","pc","require","pc"]}
1
+ {"version":3,"sources":["../src/cli-entry.ts","../src/cli.ts","../src/commands/explain.ts","../src/services/ai.ts","../src/types/error.ts","../src/utils/formatter.ts","../src/utils/logger.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { runCli } from \"./cli.js\";\n\nrunCli().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : \"Unexpected CLI failure\";\n process.stderr.write(`${message}\\n`);\n process.exit(1);\n});\n","import { access, readFile, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { type ExplainCommandOptions, runExplainCommand } from \"./commands/explain.js\";\nimport type { ExplainContext } from \"./types/error.js\";\nimport { logger } from \"./utils/logger.js\";\n\nconst require = createRequire(import.meta.url);\n\nfunction getCliVersion(): string {\n try {\n const pkg = require(\"../package.json\") as { version?: string };\n return pkg.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n return \"\";\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\").trim();\n}\n\nasync function safeReadText(filePath: string | undefined): Promise<string | undefined> {\n if (!filePath) {\n return undefined;\n }\n try {\n return await readFile(filePath, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\nasync function detectFrameworkFromPackageJson(): Promise<string | undefined> {\n try {\n const raw = await readFile(\"package.json\", \"utf8\");\n const pkg = JSON.parse(raw) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n if (\"next\" in deps) return \"Next.js\";\n if (\"react\" in deps) return \"React\";\n if (\"express\" in deps) return \"Express\";\n if (\"typescript\" in deps) return \"TypeScript\";\n if (\"fastify\" in deps) return \"Fastify\";\n if (\"nestjs\" in deps || \"@nestjs/core\" in deps) return \"NestJS\";\n } catch {\n // Best-effort auto-detection.\n }\n return undefined;\n}\n\ntype ExplainCliOptions = {\n json?: boolean;\n stack?: string;\n stackFile?: string;\n code?: string;\n codeFile?: string;\n runtime?: string;\n framework?: string;\n};\n\nasync function buildExplainOptions(options: ExplainCliOptions): Promise<ExplainCommandOptions> {\n const stackFromFile = await safeReadText(options.stackFile);\n const codeFromFile = await safeReadText(options.codeFile);\n const detectedFramework = await detectFrameworkFromPackageJson();\n\n const context: ExplainContext = {\n stackTrace: options.stack ?? stackFromFile,\n codeSnippet: options.code ?? codeFromFile,\n runtime: options.runtime ?? `Node ${process.version}`,\n framework: options.framework ?? detectedFramework ?? \"unknown\",\n };\n\n return {\n output: options.json ? \"json\" : \"pretty\",\n context,\n };\n}\n\nasync function promptForError(): Promise<string> {\n if (!process.stdin.isTTY) {\n return \"\";\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n logger.info(pc.cyan(\"Paste an error message and press Enter.\"));\n logger.info(pc.dim('Example: TypeError: Cannot read property \"map\" of undefined'));\n while (true) {\n const answer = await rl.question(pc.bold(pc.cyan(\"\\n> Error message: \")));\n const trimmed = answer.trim();\n\n if (trimmed) {\n return trimmed;\n }\n\n logger.warn(\"Error message cannot be empty. Please try again.\");\n }\n } finally {\n rl.close();\n }\n}\n\nasync function upsertEnvVar(filePath: string, key: string, value: string): Promise<void> {\n let existing = \"\";\n try {\n await access(filePath);\n existing = await readFile(filePath, \"utf8\");\n } catch {\n existing = \"\";\n }\n\n const envLine = `${key}=${value}`;\n const keyPattern = new RegExp(`^${key}=.*$`, \"m\");\n let nextContent: string;\n\n if (keyPattern.test(existing)) {\n nextContent = existing.replace(keyPattern, envLine);\n } else if (!existing.trim()) {\n nextContent = `${envLine}\\n`;\n } else {\n const needsTrailingNewline = !existing.endsWith(\"\\n\");\n nextContent = `${existing}${needsTrailingNewline ? \"\\n\" : \"\"}${envLine}\\n`;\n }\n\n await writeFile(filePath, nextContent, \"utf8\");\n}\n\nasync function ensureGroqApiKey(): Promise<boolean> {\n if (process.env.GROQ_API_KEY?.trim()) {\n return true;\n }\n\n if (!process.stdin.isTTY) {\n return false;\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n logger.warn(\"GROQ_API_KEY is missing.\");\n logger.info(pc.cyan(\"Paste your Groq API key to continue.\"));\n\n while (true) {\n const key = (await rl.question(pc.bold(pc.cyan(\"\\n> GROQ_API_KEY: \")))).trim();\n if (!key) {\n logger.warn(\"API key cannot be empty. Please try again.\");\n continue;\n }\n\n process.env.GROQ_API_KEY = key;\n\n const saveAnswer = (\n await rl.question(pc.dim(\"Save this key to .env in current directory? (Y/n): \"))\n )\n .trim()\n .toLowerCase();\n const shouldSave = saveAnswer === \"\" || saveAnswer === \"y\" || saveAnswer === \"yes\";\n\n if (shouldSave) {\n try {\n await upsertEnvVar(\".env\", \"GROQ_API_KEY\", key);\n logger.success(\"Saved GROQ_API_KEY to .env\");\n } catch {\n logger.warn(\"Could not save key to .env, but this session will continue.\");\n }\n }\n\n return true;\n }\n } finally {\n rl.close();\n }\n}\n\ntype CliLogger = {\n warn(message: string): void;\n};\n\ntype RunCliDeps = {\n runExplain?: (errorMessage: string, options?: ExplainCommandOptions) => Promise<void>;\n readStdin?: () => Promise<string>;\n promptForError?: () => Promise<string>;\n stdinIsTTY?: () => boolean;\n ensureApiKey?: () => Promise<boolean>;\n log?: CliLogger;\n};\n\nexport async function runCli(argv: string[] = process.argv, deps: RunCliDeps = {}): Promise<void> {\n const runExplain = deps.runExplain ?? runExplainCommand;\n const readStdinFn = deps.readStdin ?? readStdin;\n const promptForErrorFn = deps.promptForError ?? promptForError;\n const stdinIsTTY = deps.stdinIsTTY ?? (() => Boolean(process.stdin.isTTY));\n const ensureApiKeyFn =\n deps.ensureApiKey ?? (deps.runExplain ? async () => true : ensureGroqApiKey);\n const log = deps.log ?? logger;\n\n const program = new Command();\n\n program\n .name(\"explain-my-error\")\n .description(\"Explain programming errors with AI\")\n .version(getCliVersion())\n .addHelpText(\n \"after\",\n `\nInput modes:\n 1) Interactive (default)\n $ explain-my-error\n $ eme\n\n 2) Inline argument\n $ explain-my-error explain \"TypeError: Cannot read property 'map' of undefined\"\n $ eme explain \"ReferenceError: x is not defined\"\n\n 3) Pipe from files/commands\n $ cat error.txt | explain-my-error\n $ pnpm run build 2>&1 | eme\n\nPower features:\n - Context-aware analysis: pass stack traces, code snippets, runtime, and framework.\n - Structured output: use --json for machine-readable responses.\n - Auto framework detection: best-effort detection from local package.json.\n`,\n );\n\n program\n .command(\"explain\")\n .description(\"Explain a programming error message\")\n .argument(\"[error...]\", \"Error message to analyze\")\n .option(\"--json\", \"Output structured JSON\")\n .option(\"--stack <stackTrace>\", \"Additional stack trace context\")\n .option(\"--stack-file <path>\", \"Read stack trace from a file\")\n .option(\"--code <codeSnippet>\", \"Additional code snippet context\")\n .option(\"--code-file <path>\", \"Read code snippet from a file\")\n .option(\"--runtime <runtime>\", \"Runtime context (example: node 20, bun 1.1)\")\n .option(\"--framework <framework>\", \"Framework context (example: react, nextjs, express)\")\n .addHelpText(\n \"after\",\n `\nContext options:\n --stack inline stack trace text\n --stack-file file path for stack trace\n --code inline code snippet text\n --code-file file path for code snippet\n --runtime runtime label (default: current Node version)\n --framework framework label (auto-detected when possible)\n\nOutput modes:\n default pretty output includes:\n - likely root cause\n - 2-3 hypotheses with confidence\n - ranked fix plans (fast/proper/long-term) with tradeoffs\n - framework-specific recipes\n - remediation commands and verify checklist\n\n --json output includes the same data in machine-readable JSON.\n\nExamples:\n $ explain-my-error explain \"SyntaxError: Unexpected token }\"\n $ eme explain \"Module not found: Can't resolve 'axios'\"\n $ cat error.txt | explain-my-error explain\n $ eme explain \"TypeError: Cannot read property 'map' of undefined\" --framework react --runtime \"node 20\"\n $ eme explain --stack-file ./error.log --code-file ./src/app.ts --json\n`,\n )\n .action(async (errorParts: string[], options: ExplainCliOptions) => {\n const inlineError = errorParts.join(\" \").trim();\n const pipedError = inlineError ? \"\" : await readStdinFn();\n const promptedError = !inlineError && !pipedError ? await promptForErrorFn() : \"\";\n const finalError = inlineError || pipedError || promptedError;\n const explainOptions = await buildExplainOptions(options);\n const hasApiKey = await ensureApiKeyFn();\n if (!hasApiKey) {\n log.warn(\"GROQ_API_KEY is required. Set it and run again.\");\n return;\n }\n await runExplain(finalError, explainOptions);\n });\n\n program.action(async () => {\n if (stdinIsTTY()) {\n const promptedError = await promptForErrorFn();\n await runExplain(promptedError, await buildExplainOptions({}));\n return;\n }\n\n const pipedError = await readStdinFn();\n if (!pipedError) {\n log.warn('No input detected. Use: explain-my-error explain \"<error message>\"');\n return;\n }\n\n const hasApiKey = await ensureApiKeyFn();\n if (!hasApiKey) {\n log.warn(\"GROQ_API_KEY is required. Set it and run again.\");\n return;\n }\n\n await runExplain(pipedError, await buildExplainOptions({}));\n });\n\n await program.parseAsync(argv);\n}\n","import ora from \"ora\";\nimport { explainErrorWithAI } from \"../services/ai.js\";\nimport type { ExplainContext, ExplainedError } from \"../types/error.js\";\nimport { formatExplainedError } from \"../utils/formatter.js\";\nimport { logger } from \"../utils/logger.js\";\n\ntype SpinnerLike = {\n succeed(text: string): void;\n fail(text: string): void;\n};\n\ntype ExplainLogger = {\n info(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n};\n\ntype RunExplainDeps = {\n explainError?: (errorMessage: string, context?: ExplainContext) => Promise<ExplainedError>;\n createSpinner?: (text: string) => SpinnerLike;\n formatOutput?: (result: ExplainedError) => string;\n log?: ExplainLogger;\n};\n\nexport type ExplainCommandOptions = {\n output: \"pretty\" | \"json\";\n context?: ExplainContext;\n};\n\nfunction isDepsObject(value: unknown): value is RunExplainDeps {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n return (\n \"explainError\" in candidate ||\n \"createSpinner\" in candidate ||\n \"formatOutput\" in candidate ||\n \"log\" in candidate\n );\n}\n\nexport async function runExplainCommand(\n errorMessage: string,\n optionsOrDeps: ExplainCommandOptions | RunExplainDeps = { output: \"pretty\" },\n depsArg: RunExplainDeps = {},\n): Promise<void> {\n const options = isDepsObject(optionsOrDeps) ? { output: \"pretty\" as const } : optionsOrDeps;\n const deps = isDepsObject(optionsOrDeps) ? optionsOrDeps : depsArg;\n\n const explainError = deps.explainError ?? explainErrorWithAI;\n const createSpinner = deps.createSpinner ?? ((text: string) => ora(text).start());\n const formatOutput = deps.formatOutput ?? formatExplainedError;\n const log = deps.log ?? logger;\n\n if (!errorMessage?.trim()) {\n log.warn(\"Please provide an error message.\");\n return;\n }\n\n const spinner = createSpinner(\"Analyzing your error...\");\n\n try {\n const result = await explainError(errorMessage.trim(), options.context);\n spinner.succeed(\"Explanation ready.\");\n log.info(\"\");\n if (options.output === \"json\") {\n log.info(JSON.stringify(result, null, 2));\n } else {\n log.info(formatOutput(result));\n }\n } catch (error) {\n spinner.fail(\"Could not explain this error.\");\n const message = error instanceof Error ? error.message : \"Unknown error\";\n log.error(message);\n }\n}\n","import axios from \"axios\";\nimport { type ExplainContext, type ExplainedError, explainedErrorSchema } from \"../types/error.js\";\n\nconst GROQ_API_URL = \"https://api.groq.com/openai/v1/chat/completions\";\nconst PRIMARY_GROQ_MODEL = \"llama3-70b-8192\";\nconst FALLBACK_GROQ_MODEL = process.env.GROQ_FALLBACK_MODEL ?? \"llama-3.3-70b-versatile\";\n\ntype GroqChatResponse = {\n choices?: Array<{ message?: { content?: string } }>;\n};\n\nfunction extractJson(content: string): unknown {\n const trimmed = content.trim();\n\n const tryParse = (input: string): unknown | null => {\n try {\n return JSON.parse(input);\n } catch {\n return null;\n }\n };\n\n const sanitizeControlCharsInStrings = (input: string): string => {\n let result = \"\";\n let inString = false;\n let escaping = false;\n\n for (let i = 0; i < input.length; i += 1) {\n const ch = input[i];\n\n if (!inString) {\n result += ch;\n if (ch === '\"') {\n inString = true;\n }\n continue;\n }\n\n if (escaping) {\n result += ch;\n escaping = false;\n continue;\n }\n\n if (ch === \"\\\\\") {\n result += ch;\n escaping = true;\n continue;\n }\n\n if (ch === '\"') {\n result += ch;\n inString = false;\n continue;\n }\n\n if (ch === \"\\n\") {\n result += \"\\\\n\";\n continue;\n }\n if (ch === \"\\r\") {\n result += \"\\\\r\";\n continue;\n }\n if (ch === \"\\t\") {\n result += \"\\\\t\";\n continue;\n }\n\n const code = ch.charCodeAt(0);\n if (code < 0x20) {\n result += `\\\\u${code.toString(16).padStart(4, \"0\")}`;\n continue;\n }\n\n result += ch;\n }\n\n return result;\n };\n\n const direct = tryParse(trimmed);\n if (direct !== null) {\n return direct;\n }\n\n const match = trimmed.match(/\\{[\\s\\S]*\\}/);\n if (!match) {\n throw new Error(\"AI did not return valid JSON.\");\n }\n\n const extracted = match[0];\n const extractedParsed = tryParse(extracted);\n if (extractedParsed !== null) {\n return extractedParsed;\n }\n\n const sanitized = sanitizeControlCharsInStrings(extracted);\n const sanitizedParsed = tryParse(sanitized);\n if (sanitizedParsed !== null) {\n return sanitizedParsed;\n }\n\n throw new Error(\"AI did not return valid JSON.\");\n}\n\nfunction stringifyField(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => stringifyField(item))\n .map((item) => item.trim())\n .filter(Boolean);\n }\n return stringifyField(value)\n .split(/\\n|,/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction toConfidence(value: unknown): number {\n if (typeof value === \"number\") {\n return Math.max(0, Math.min(1, value));\n }\n const parsed = Number(stringifyField(value));\n if (!Number.isNaN(parsed)) {\n return Math.max(0, Math.min(1, parsed));\n }\n return 0.5;\n}\n\nfunction normalizeResponseShape(payload: unknown): unknown {\n if (!payload || typeof payload !== \"object\") {\n return payload;\n }\n\n const data = payload as Record<string, unknown>;\n\n const commonCauses = toStringArray(data.common_causes);\n\n const hypothesesRaw = Array.isArray(data.hypotheses) ? data.hypotheses : [];\n const hypotheses = hypothesesRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n hypothesis: stringifyField(row?.hypothesis),\n confidence: toConfidence(row?.confidence),\n why: stringifyField(row?.why),\n };\n })\n .filter((item) => item.hypothesis && item.why)\n .slice(0, 3);\n\n const fixPlansRaw = Array.isArray(data.fix_plans) ? data.fix_plans : [];\n const normalizedFixPlans = fixPlansRaw\n .map((item, index) => {\n const row = item as Record<string, unknown>;\n const defaultPlan = index === 0 ? \"fast_patch\" : index === 1 ? \"proper_fix\" : \"long_term_fix\";\n const planText = stringifyField(row?.plan || defaultPlan).toLowerCase();\n const plan =\n planText === \"fast_patch\" || planText === \"proper_fix\" || planText === \"long_term_fix\"\n ? planText\n : defaultPlan;\n\n const tradeoffs = (row?.tradeoffs ?? {}) as Record<string, unknown>;\n return {\n plan,\n summary: stringifyField(row?.summary),\n steps: toStringArray(row?.steps),\n tradeoffs: {\n risk: stringifyField(tradeoffs.risk || \"Unknown\"),\n performance: stringifyField(tradeoffs.performance || \"Unknown\"),\n maintainability: stringifyField(tradeoffs.maintainability || \"Unknown\"),\n },\n };\n })\n .filter((item) => item.summary && item.steps.length > 0);\n\n const fixPlans =\n normalizedFixPlans.length >= 3\n ? normalizedFixPlans.slice(0, 3)\n : [\n {\n plan: \"fast_patch\",\n summary: stringifyField(data.fix),\n steps: [stringifyField(data.fix) || \"Apply a defensive guard around the failing line.\"],\n tradeoffs: {\n risk: \"May hide deeper data contract issues.\",\n performance: \"Minimal runtime overhead.\",\n maintainability: \"Good short-term, revisit for root-cause cleanup.\",\n },\n },\n {\n plan: \"proper_fix\",\n summary: \"Fix data flow and initialization path.\",\n steps: [\n \"Trace where the failing value is created.\",\n \"Initialize value before usage and add proper null checks.\",\n \"Add a regression test for this scenario.\",\n ],\n tradeoffs: {\n risk: \"Moderate code changes.\",\n performance: \"Neutral to slightly improved.\",\n maintainability: \"Better long-term readability and reliability.\",\n },\n },\n {\n plan: \"long_term_fix\",\n summary: \"Enforce stronger contracts and prevention tooling.\",\n steps: [\n \"Enable stricter type checks and lint rules.\",\n \"Introduce runtime validation for external inputs.\",\n \"Create reusable utility guards in shared modules.\",\n ],\n tradeoffs: {\n risk: \"Requires broader refactor.\",\n performance: \"Potential minor validation overhead.\",\n maintainability: \"Highest long-term stability.\",\n },\n },\n ];\n\n const frameworkRecipesRaw = Array.isArray(data.framework_recipes) ? data.framework_recipes : [];\n const frameworkRecipes = frameworkRecipesRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n framework: stringifyField(row?.framework),\n when_to_use: stringifyField(row?.when_to_use),\n steps: toStringArray(row?.steps),\n code_snippet: stringifyField(row?.code_snippet),\n };\n })\n .filter(\n (item) => item.framework && item.when_to_use && item.steps.length > 0 && item.code_snippet,\n );\n\n const remediationBlocksRaw = Array.isArray(data.remediation_blocks)\n ? data.remediation_blocks\n : [];\n const remediationBlocks = remediationBlocksRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n title: stringifyField(row?.title),\n commands: toStringArray(row?.commands),\n snippet: stringifyField(row?.snippet) || undefined,\n };\n })\n .filter((item) => item.title && item.commands.length > 0);\n\n const verifyChecklist = toStringArray(data.verify_checklist);\n\n const title = stringifyField(data.title);\n const explanation = stringifyField(data.explanation);\n const codeExample = stringifyField(data.code_example);\n const fix = stringifyField(data.fix);\n const likelyRootCause =\n stringifyField(data.likely_root_cause) ||\n commonCauses[0] ||\n \"Insufficient context from error text.\";\n\n return {\n title: title || \"Unknown error\",\n explanation: explanation || \"Unable to derive explanation from model response.\",\n common_causes:\n commonCauses.length > 0 ? commonCauses : [\"Insufficient context in provided error text.\"],\n fix: fix || \"Add guards and trace value initialization before the failing line.\",\n code_example: codeExample || \"// Add null checks around the failing line.\",\n eli5: stringifyField(data.eli5) || \"Your code expected one thing, but got something different.\",\n likely_root_cause: likelyRootCause,\n hypotheses:\n hypotheses.length > 0\n ? hypotheses\n : [\n {\n hypothesis: likelyRootCause,\n confidence: 0.6,\n why: \"Derived from error pattern and available context.\",\n },\n ],\n fix_plans: fixPlans,\n framework_recipes:\n frameworkRecipes.length > 0\n ? frameworkRecipes\n : [\n {\n framework: \"Node.js\",\n when_to_use: \"Default runtime fallback when framework is unknown.\",\n steps: [\n \"Validate all external data before use.\",\n \"Guard nullable values before method calls.\",\n \"Add test coverage for this failure path.\",\n ],\n code_snippet: \"const safeValue = input ?? defaultValue;\",\n },\n ],\n remediation_blocks:\n remediationBlocks.length > 0\n ? remediationBlocks\n : [\n {\n title: \"Quick remediation commands\",\n commands: [\"npm run test\", \"npm run lint\"],\n },\n ],\n verify_checklist:\n verifyChecklist.length > 0\n ? verifyChecklist\n : [\"Re-run failing command.\", \"Confirm no regression in related flows.\"],\n };\n}\n\nexport async function explainErrorWithAI(\n errorMessage: string,\n context: ExplainContext = {},\n): Promise<ExplainedError> {\n const apiKey = process.env.GROQ_API_KEY;\n if (!apiKey) {\n throw new Error(\n [\n \"Missing GROQ_API_KEY environment variable.\",\n \"\",\n \"Quick setup:\",\n \" macOS/Linux (zsh/bash):\",\n ' export GROQ_API_KEY=\"your_groq_api_key\"',\n \"\",\n \" Windows PowerShell:\",\n ' $env:GROQ_API_KEY=\"your_groq_api_key\"',\n \"\",\n \"Then run the CLI again.\",\n ].join(\"\\n\"),\n );\n }\n\n const prompt = `You are a senior software engineer helping debug errors with context.\nReturn STRICT JSON only (no markdown) with fields:\n- title\n- explanation\n- common_causes (string[])\n- fix\n- code_example\n- eli5\n- likely_root_cause\n- hypotheses (2-3 items): [{ hypothesis, confidence (0..1), why }]\n- fix_plans (exactly 3): [\n { plan: \"fast_patch\", summary, steps[], tradeoffs: { risk, performance, maintainability } },\n { plan: \"proper_fix\", summary, steps[], tradeoffs: { risk, performance, maintainability } },\n { plan: \"long_term_fix\", summary, steps[], tradeoffs: { risk, performance, maintainability } }\n]\n- framework_recipes (1+): [{ framework, when_to_use, steps[], code_snippet }]\n- remediation_blocks (1+): [{ title, commands[], snippet? }]\n- verify_checklist (string[])\n\nUse provided runtime/framework/code/stack context to produce context-aware likely root cause and framework-specific fixes.`;\n\n const contextBlock = [\n `Error message:\\n${errorMessage}`,\n `Runtime:\\n${context.runtime ?? \"unknown\"}`,\n `Framework:\\n${context.framework ?? \"unknown\"}`,\n `Stack trace:\\n${context.stackTrace ?? \"not provided\"}`,\n `Code snippet:\\n${context.codeSnippet ?? \"not provided\"}`,\n ].join(\"\\n\\n\");\n\n const requestBody = {\n messages: [\n { role: \"system\" as const, content: prompt },\n {\n role: \"user\" as const,\n content: `${contextBlock}\\n\\nReturn strict JSON only.`,\n },\n ],\n temperature: 0.2,\n };\n\n const requestConfig = {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n timeout: 30000,\n };\n\n let response: { data?: GroqChatResponse };\n try {\n response = await axios.post(\n GROQ_API_URL,\n { model: PRIMARY_GROQ_MODEL, ...requestBody },\n requestConfig,\n );\n } catch (error) {\n if (axios.isAxiosError(error)) {\n const providerMessage =\n typeof error.response?.data?.error?.message === \"string\"\n ? error.response.data.error.message\n : error.message;\n\n const isModelDecommissioned =\n providerMessage.toLowerCase().includes(\"decommissioned\") ||\n providerMessage.toLowerCase().includes(\"no longer supported\");\n\n if (isModelDecommissioned) {\n response = await axios.post(\n GROQ_API_URL,\n { model: FALLBACK_GROQ_MODEL, ...requestBody },\n requestConfig,\n );\n } else {\n throw new Error(`Groq API request failed: ${providerMessage}`);\n }\n } else {\n throw error;\n }\n }\n\n const content = response.data?.choices?.[0]?.message?.content;\n if (typeof content !== \"string\" || !content.trim()) {\n throw new Error(\"AI response was empty.\");\n }\n\n const parsed = extractJson(content);\n const normalized = normalizeResponseShape(parsed);\n return explainedErrorSchema.parse(normalized);\n}\n","import { z } from \"zod\";\n\nexport const hypothesisSchema = z.object({\n hypothesis: z.string().min(1),\n confidence: z.number().min(0).max(1),\n why: z.string().min(1),\n});\n\nexport const fixPlanSchema = z.object({\n plan: z.enum([\"fast_patch\", \"proper_fix\", \"long_term_fix\"]),\n summary: z.string().min(1),\n steps: z.array(z.string().min(1)).min(1),\n tradeoffs: z.object({\n risk: z.string().min(1),\n performance: z.string().min(1),\n maintainability: z.string().min(1),\n }),\n});\n\nexport const frameworkRecipeSchema = z.object({\n framework: z.string().min(1),\n when_to_use: z.string().min(1),\n steps: z.array(z.string().min(1)).min(1),\n code_snippet: z.string().min(1),\n});\n\nexport const remediationBlockSchema = z.object({\n title: z.string().min(1),\n commands: z.array(z.string().min(1)).min(1),\n snippet: z.string().optional(),\n});\n\nexport const explainedErrorSchema = z.object({\n title: z.string().min(1),\n explanation: z.string().min(1),\n common_causes: z.array(z.string().min(1)).min(1),\n fix: z.string().min(1),\n code_example: z.string().min(1),\n eli5: z.string().min(1),\n likely_root_cause: z.string().min(1),\n hypotheses: z.array(hypothesisSchema).min(1).max(3),\n fix_plans: z.array(fixPlanSchema).min(3),\n framework_recipes: z.array(frameworkRecipeSchema).min(1),\n remediation_blocks: z.array(remediationBlockSchema).min(1),\n verify_checklist: z.array(z.string().min(1)).min(1),\n});\n\nexport type ExplainedError = z.infer<typeof explainedErrorSchema>;\nexport type ExplainHypothesis = z.infer<typeof hypothesisSchema>;\nexport type FixPlan = z.infer<typeof fixPlanSchema>;\nexport type FrameworkRecipe = z.infer<typeof frameworkRecipeSchema>;\nexport type RemediationBlock = z.infer<typeof remediationBlockSchema>;\n\nexport type ExplainContext = {\n stackTrace?: string;\n codeSnippet?: string;\n runtime?: string;\n framework?: string;\n};\n","import pc from \"picocolors\";\nimport type { ExplainedError } from \"../types/error.js\";\n\nconst CARD_WIDTH = 72;\n\nfunction line(char = \"-\"): string {\n return char.repeat(CARD_WIDTH);\n}\n\nfunction pad(text: string): string {\n return text.length > CARD_WIDTH - 4 ? `${text.slice(0, CARD_WIDTH - 7)}...` : text;\n}\n\nfunction framedLine(text: string): string {\n return `| ${pad(text).padEnd(CARD_WIDTH - 4)} |`;\n}\n\nfunction block(title: string, body: string): string {\n const rows = body.split(\"\\n\").map((row) => pc.white(row));\n return [pc.cyan(line()), pc.bold(pc.cyan(title)), ...rows, pc.cyan(line())].join(\"\\n\");\n}\n\nfunction list(items: string[]): string {\n return items.map((item, index) => `${index + 1}. ${item}`).join(\"\\n\");\n}\n\nexport function formatExplainedError(result: ExplainedError): string {\n const commonCauses = list(result.common_causes);\n const hypotheses = result.hypotheses\n .map(\n (item, index) =>\n `${index + 1}. ${item.hypothesis}\\n confidence: ${(item.confidence * 100).toFixed(0)}%\\n why: ${item.why}`,\n )\n .join(\"\\n\\n\");\n const fixPlans = result.fix_plans\n .map((plan) => {\n const label =\n plan.plan === \"fast_patch\"\n ? \"Fast Patch\"\n : plan.plan === \"proper_fix\"\n ? \"Proper Fix\"\n : \"Long-Term Fix\";\n return [\n `${pc.bold(pc.green(label))}: ${plan.summary}`,\n ...plan.steps.map((step, index) => ` ${index + 1}. ${step}`),\n ` tradeoffs -> risk: ${plan.tradeoffs.risk}; performance: ${plan.tradeoffs.performance}; maintainability: ${plan.tradeoffs.maintainability}`,\n ].join(\"\\n\");\n })\n .join(\"\\n\\n\");\n const frameworkRecipes = result.framework_recipes\n .map((recipe) =>\n [\n `${pc.bold(pc.cyan(recipe.framework))}: ${recipe.when_to_use}`,\n ...recipe.steps.map((step, index) => ` ${index + 1}. ${step}`),\n \" snippet:\",\n recipe.code_snippet\n .split(\"\\n\")\n .map((lineText) => ` ${lineText}`)\n .join(\"\\n\"),\n ].join(\"\\n\"),\n )\n .join(\"\\n\\n\");\n const remediationBlocks = result.remediation_blocks\n .map((blockItem) => {\n const snippet = blockItem.snippet?.trim()\n ? `\\n snippet:\\n${blockItem.snippet\n .split(\"\\n\")\n .map((lineText) => ` ${lineText}`)\n .join(\"\\n\")}`\n : \"\";\n return (\n [\n `${pc.bold(pc.green(blockItem.title))}`,\n ...blockItem.commands.map((command) => ` $ ${command}`),\n ].join(\"\\n\") + snippet\n );\n })\n .join(\"\\n\\n\");\n const verifyChecklist = list(result.verify_checklist);\n const hero = [\n pc.cyan(line(\"=\")),\n framedLine(pc.bold(pc.cyan(\"EXPLAIN MY ERROR\"))),\n framedLine(pc.dim(\"AI powered debugging for humans\")),\n pc.cyan(line(\"=\")),\n ].join(\"\\n\");\n\n return [\n hero,\n \"\",\n `${pc.bold(pc.cyan(\"ERROR\"))}: ${pc.bold(pc.white(result.title))}`,\n `${pc.bold(pc.yellow(\"LIKELY ROOT CAUSE\"))}: ${pc.white(result.likely_root_cause)}`,\n \"\",\n block(\"EXPLANATION\", result.explanation),\n \"\",\n block(\"COMMON CAUSES\", commonCauses),\n \"\",\n block(\"HYPOTHESES (WITH CONFIDENCE)\", hypotheses),\n \"\",\n block(\"RANKED FIX PLANS\", fixPlans),\n \"\",\n `${pc.bold(pc.green(\"FIX\"))}\\n${pc.white(result.fix)}`,\n \"\",\n block(\"CODE EXAMPLE\", result.code_example),\n \"\",\n block(\"FRAMEWORK-SPECIFIC RECIPES\", frameworkRecipes),\n \"\",\n block(\"COPY-PASTE REMEDIATION\", remediationBlocks),\n \"\",\n block(\"VERIFY CHECKLIST\", verifyChecklist),\n \"\",\n block(\"ELI5\", result.eli5),\n \"\",\n pc.dim('Tip: run `eme explain \"<error>\"` for quick mode.'),\n ].join(\"\\n\");\n}\n","import pc from \"picocolors\";\n\nexport const logger = {\n info(message: string): void {\n process.stdout.write(`${pc.white(message)}\\n`);\n },\n success(message: string): void {\n process.stdout.write(`${pc.green(`OK: ${message}`)}\\n`);\n },\n warn(message: string): void {\n process.stderr.write(`${pc.yellow(`WARN: ${message}`)}\\n`);\n },\n error(message: string): void {\n process.stderr.write(`${pc.red(`ERROR: ${message}`)}\\n`);\n },\n};\n"],"mappings":"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","names":["pc","pc","require","pc"]}
package/dist/index.js CHANGED
@@ -719,11 +719,34 @@ Input modes:
719
719
  3) Pipe from files/commands
720
720
  $ cat error.txt | explain-my-error
721
721
  $ pnpm run build 2>&1 | eme
722
+
723
+ Power features:
724
+ - Context-aware analysis: pass stack traces, code snippets, runtime, and framework.
725
+ - Structured output: use --json for machine-readable responses.
726
+ - Auto framework detection: best-effort detection from local package.json.
722
727
  `
723
728
  );
724
729
  program.command("explain").description("Explain a programming error message").argument("[error...]", "Error message to analyze").option("--json", "Output structured JSON").option("--stack <stackTrace>", "Additional stack trace context").option("--stack-file <path>", "Read stack trace from a file").option("--code <codeSnippet>", "Additional code snippet context").option("--code-file <path>", "Read code snippet from a file").option("--runtime <runtime>", "Runtime context (example: node 20, bun 1.1)").option("--framework <framework>", "Framework context (example: react, nextjs, express)").addHelpText(
725
730
  "after",
726
731
  `
732
+ Context options:
733
+ --stack inline stack trace text
734
+ --stack-file file path for stack trace
735
+ --code inline code snippet text
736
+ --code-file file path for code snippet
737
+ --runtime runtime label (default: current Node version)
738
+ --framework framework label (auto-detected when possible)
739
+
740
+ Output modes:
741
+ default pretty output includes:
742
+ - likely root cause
743
+ - 2-3 hypotheses with confidence
744
+ - ranked fix plans (fast/proper/long-term) with tradeoffs
745
+ - framework-specific recipes
746
+ - remediation commands and verify checklist
747
+
748
+ --json output includes the same data in machine-readable JSON.
749
+
727
750
  Examples:
728
751
  $ explain-my-error explain "SyntaxError: Unexpected token }"
729
752
  $ eme explain "Module not found: Can't resolve 'axios'"
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/explain.ts","../src/services/ai.ts","../src/types/error.ts","../src/utils/formatter.ts","../src/utils/logger.ts","../src/explain.ts","../src/skills/explainError.skill.ts"],"sourcesContent":["import { access, readFile, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { type ExplainCommandOptions, runExplainCommand } from \"./commands/explain.js\";\nimport type { ExplainContext } from \"./types/error.js\";\nimport { logger } from \"./utils/logger.js\";\n\nconst require = createRequire(import.meta.url);\n\nfunction getCliVersion(): string {\n try {\n const pkg = require(\"../package.json\") as { version?: string };\n return pkg.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n return \"\";\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\").trim();\n}\n\nasync function safeReadText(filePath: string | undefined): Promise<string | undefined> {\n if (!filePath) {\n return undefined;\n }\n try {\n return await readFile(filePath, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\nasync function detectFrameworkFromPackageJson(): Promise<string | undefined> {\n try {\n const raw = await readFile(\"package.json\", \"utf8\");\n const pkg = JSON.parse(raw) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n if (\"next\" in deps) return \"Next.js\";\n if (\"react\" in deps) return \"React\";\n if (\"express\" in deps) return \"Express\";\n if (\"typescript\" in deps) return \"TypeScript\";\n if (\"fastify\" in deps) return \"Fastify\";\n if (\"nestjs\" in deps || \"@nestjs/core\" in deps) return \"NestJS\";\n } catch {\n // Best-effort auto-detection.\n }\n return undefined;\n}\n\ntype ExplainCliOptions = {\n json?: boolean;\n stack?: string;\n stackFile?: string;\n code?: string;\n codeFile?: string;\n runtime?: string;\n framework?: string;\n};\n\nasync function buildExplainOptions(options: ExplainCliOptions): Promise<ExplainCommandOptions> {\n const stackFromFile = await safeReadText(options.stackFile);\n const codeFromFile = await safeReadText(options.codeFile);\n const detectedFramework = await detectFrameworkFromPackageJson();\n\n const context: ExplainContext = {\n stackTrace: options.stack ?? stackFromFile,\n codeSnippet: options.code ?? codeFromFile,\n runtime: options.runtime ?? `Node ${process.version}`,\n framework: options.framework ?? detectedFramework ?? \"unknown\",\n };\n\n return {\n output: options.json ? \"json\" : \"pretty\",\n context,\n };\n}\n\nasync function promptForError(): Promise<string> {\n if (!process.stdin.isTTY) {\n return \"\";\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n logger.info(pc.cyan(\"Paste an error message and press Enter.\"));\n logger.info(pc.dim('Example: TypeError: Cannot read property \"map\" of undefined'));\n while (true) {\n const answer = await rl.question(pc.bold(pc.cyan(\"\\n> Error message: \")));\n const trimmed = answer.trim();\n\n if (trimmed) {\n return trimmed;\n }\n\n logger.warn(\"Error message cannot be empty. Please try again.\");\n }\n } finally {\n rl.close();\n }\n}\n\nasync function upsertEnvVar(filePath: string, key: string, value: string): Promise<void> {\n let existing = \"\";\n try {\n await access(filePath);\n existing = await readFile(filePath, \"utf8\");\n } catch {\n existing = \"\";\n }\n\n const envLine = `${key}=${value}`;\n const keyPattern = new RegExp(`^${key}=.*$`, \"m\");\n let nextContent: string;\n\n if (keyPattern.test(existing)) {\n nextContent = existing.replace(keyPattern, envLine);\n } else if (!existing.trim()) {\n nextContent = `${envLine}\\n`;\n } else {\n const needsTrailingNewline = !existing.endsWith(\"\\n\");\n nextContent = `${existing}${needsTrailingNewline ? \"\\n\" : \"\"}${envLine}\\n`;\n }\n\n await writeFile(filePath, nextContent, \"utf8\");\n}\n\nasync function ensureGroqApiKey(): Promise<boolean> {\n if (process.env.GROQ_API_KEY?.trim()) {\n return true;\n }\n\n if (!process.stdin.isTTY) {\n return false;\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n logger.warn(\"GROQ_API_KEY is missing.\");\n logger.info(pc.cyan(\"Paste your Groq API key to continue.\"));\n\n while (true) {\n const key = (await rl.question(pc.bold(pc.cyan(\"\\n> GROQ_API_KEY: \")))).trim();\n if (!key) {\n logger.warn(\"API key cannot be empty. Please try again.\");\n continue;\n }\n\n process.env.GROQ_API_KEY = key;\n\n const saveAnswer = (\n await rl.question(pc.dim(\"Save this key to .env in current directory? (Y/n): \"))\n )\n .trim()\n .toLowerCase();\n const shouldSave = saveAnswer === \"\" || saveAnswer === \"y\" || saveAnswer === \"yes\";\n\n if (shouldSave) {\n try {\n await upsertEnvVar(\".env\", \"GROQ_API_KEY\", key);\n logger.success(\"Saved GROQ_API_KEY to .env\");\n } catch {\n logger.warn(\"Could not save key to .env, but this session will continue.\");\n }\n }\n\n return true;\n }\n } finally {\n rl.close();\n }\n}\n\ntype CliLogger = {\n warn(message: string): void;\n};\n\ntype RunCliDeps = {\n runExplain?: (errorMessage: string, options?: ExplainCommandOptions) => Promise<void>;\n readStdin?: () => Promise<string>;\n promptForError?: () => Promise<string>;\n stdinIsTTY?: () => boolean;\n ensureApiKey?: () => Promise<boolean>;\n log?: CliLogger;\n};\n\nexport async function runCli(argv: string[] = process.argv, deps: RunCliDeps = {}): Promise<void> {\n const runExplain = deps.runExplain ?? runExplainCommand;\n const readStdinFn = deps.readStdin ?? readStdin;\n const promptForErrorFn = deps.promptForError ?? promptForError;\n const stdinIsTTY = deps.stdinIsTTY ?? (() => Boolean(process.stdin.isTTY));\n const ensureApiKeyFn =\n deps.ensureApiKey ?? (deps.runExplain ? async () => true : ensureGroqApiKey);\n const log = deps.log ?? logger;\n\n const program = new Command();\n\n program\n .name(\"explain-my-error\")\n .description(\"Explain programming errors with AI\")\n .version(getCliVersion())\n .addHelpText(\n \"after\",\n `\nInput modes:\n 1) Interactive (default)\n $ explain-my-error\n $ eme\n\n 2) Inline argument\n $ explain-my-error explain \"TypeError: Cannot read property 'map' of undefined\"\n $ eme explain \"ReferenceError: x is not defined\"\n\n 3) Pipe from files/commands\n $ cat error.txt | explain-my-error\n $ pnpm run build 2>&1 | eme\n`,\n );\n\n program\n .command(\"explain\")\n .description(\"Explain a programming error message\")\n .argument(\"[error...]\", \"Error message to analyze\")\n .option(\"--json\", \"Output structured JSON\")\n .option(\"--stack <stackTrace>\", \"Additional stack trace context\")\n .option(\"--stack-file <path>\", \"Read stack trace from a file\")\n .option(\"--code <codeSnippet>\", \"Additional code snippet context\")\n .option(\"--code-file <path>\", \"Read code snippet from a file\")\n .option(\"--runtime <runtime>\", \"Runtime context (example: node 20, bun 1.1)\")\n .option(\"--framework <framework>\", \"Framework context (example: react, nextjs, express)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ explain-my-error explain \"SyntaxError: Unexpected token }\"\n $ eme explain \"Module not found: Can't resolve 'axios'\"\n $ cat error.txt | explain-my-error explain\n $ eme explain \"TypeError: Cannot read property 'map' of undefined\" --framework react --runtime \"node 20\"\n $ eme explain --stack-file ./error.log --code-file ./src/app.ts --json\n`,\n )\n .action(async (errorParts: string[], options: ExplainCliOptions) => {\n const inlineError = errorParts.join(\" \").trim();\n const pipedError = inlineError ? \"\" : await readStdinFn();\n const promptedError = !inlineError && !pipedError ? await promptForErrorFn() : \"\";\n const finalError = inlineError || pipedError || promptedError;\n const explainOptions = await buildExplainOptions(options);\n const hasApiKey = await ensureApiKeyFn();\n if (!hasApiKey) {\n log.warn(\"GROQ_API_KEY is required. Set it and run again.\");\n return;\n }\n await runExplain(finalError, explainOptions);\n });\n\n program.action(async () => {\n if (stdinIsTTY()) {\n const promptedError = await promptForErrorFn();\n await runExplain(promptedError, await buildExplainOptions({}));\n return;\n }\n\n const pipedError = await readStdinFn();\n if (!pipedError) {\n log.warn('No input detected. Use: explain-my-error explain \"<error message>\"');\n return;\n }\n\n const hasApiKey = await ensureApiKeyFn();\n if (!hasApiKey) {\n log.warn(\"GROQ_API_KEY is required. Set it and run again.\");\n return;\n }\n\n await runExplain(pipedError, await buildExplainOptions({}));\n });\n\n await program.parseAsync(argv);\n}\n","import ora from \"ora\";\nimport { explainErrorWithAI } from \"../services/ai.js\";\nimport type { ExplainContext, ExplainedError } from \"../types/error.js\";\nimport { formatExplainedError } from \"../utils/formatter.js\";\nimport { logger } from \"../utils/logger.js\";\n\ntype SpinnerLike = {\n succeed(text: string): void;\n fail(text: string): void;\n};\n\ntype ExplainLogger = {\n info(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n};\n\ntype RunExplainDeps = {\n explainError?: (errorMessage: string, context?: ExplainContext) => Promise<ExplainedError>;\n createSpinner?: (text: string) => SpinnerLike;\n formatOutput?: (result: ExplainedError) => string;\n log?: ExplainLogger;\n};\n\nexport type ExplainCommandOptions = {\n output: \"pretty\" | \"json\";\n context?: ExplainContext;\n};\n\nfunction isDepsObject(value: unknown): value is RunExplainDeps {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n return (\n \"explainError\" in candidate ||\n \"createSpinner\" in candidate ||\n \"formatOutput\" in candidate ||\n \"log\" in candidate\n );\n}\n\nexport async function runExplainCommand(\n errorMessage: string,\n optionsOrDeps: ExplainCommandOptions | RunExplainDeps = { output: \"pretty\" },\n depsArg: RunExplainDeps = {},\n): Promise<void> {\n const options = isDepsObject(optionsOrDeps) ? { output: \"pretty\" as const } : optionsOrDeps;\n const deps = isDepsObject(optionsOrDeps) ? optionsOrDeps : depsArg;\n\n const explainError = deps.explainError ?? explainErrorWithAI;\n const createSpinner = deps.createSpinner ?? ((text: string) => ora(text).start());\n const formatOutput = deps.formatOutput ?? formatExplainedError;\n const log = deps.log ?? logger;\n\n if (!errorMessage?.trim()) {\n log.warn(\"Please provide an error message.\");\n return;\n }\n\n const spinner = createSpinner(\"Analyzing your error...\");\n\n try {\n const result = await explainError(errorMessage.trim(), options.context);\n spinner.succeed(\"Explanation ready.\");\n log.info(\"\");\n if (options.output === \"json\") {\n log.info(JSON.stringify(result, null, 2));\n } else {\n log.info(formatOutput(result));\n }\n } catch (error) {\n spinner.fail(\"Could not explain this error.\");\n const message = error instanceof Error ? error.message : \"Unknown error\";\n log.error(message);\n }\n}\n","import axios from \"axios\";\nimport { type ExplainContext, type ExplainedError, explainedErrorSchema } from \"../types/error.js\";\n\nconst GROQ_API_URL = \"https://api.groq.com/openai/v1/chat/completions\";\nconst PRIMARY_GROQ_MODEL = \"llama3-70b-8192\";\nconst FALLBACK_GROQ_MODEL = process.env.GROQ_FALLBACK_MODEL ?? \"llama-3.3-70b-versatile\";\n\ntype GroqChatResponse = {\n choices?: Array<{ message?: { content?: string } }>;\n};\n\nfunction extractJson(content: string): unknown {\n const trimmed = content.trim();\n\n const tryParse = (input: string): unknown | null => {\n try {\n return JSON.parse(input);\n } catch {\n return null;\n }\n };\n\n const sanitizeControlCharsInStrings = (input: string): string => {\n let result = \"\";\n let inString = false;\n let escaping = false;\n\n for (let i = 0; i < input.length; i += 1) {\n const ch = input[i];\n\n if (!inString) {\n result += ch;\n if (ch === '\"') {\n inString = true;\n }\n continue;\n }\n\n if (escaping) {\n result += ch;\n escaping = false;\n continue;\n }\n\n if (ch === \"\\\\\") {\n result += ch;\n escaping = true;\n continue;\n }\n\n if (ch === '\"') {\n result += ch;\n inString = false;\n continue;\n }\n\n if (ch === \"\\n\") {\n result += \"\\\\n\";\n continue;\n }\n if (ch === \"\\r\") {\n result += \"\\\\r\";\n continue;\n }\n if (ch === \"\\t\") {\n result += \"\\\\t\";\n continue;\n }\n\n const code = ch.charCodeAt(0);\n if (code < 0x20) {\n result += `\\\\u${code.toString(16).padStart(4, \"0\")}`;\n continue;\n }\n\n result += ch;\n }\n\n return result;\n };\n\n const direct = tryParse(trimmed);\n if (direct !== null) {\n return direct;\n }\n\n const match = trimmed.match(/\\{[\\s\\S]*\\}/);\n if (!match) {\n throw new Error(\"AI did not return valid JSON.\");\n }\n\n const extracted = match[0];\n const extractedParsed = tryParse(extracted);\n if (extractedParsed !== null) {\n return extractedParsed;\n }\n\n const sanitized = sanitizeControlCharsInStrings(extracted);\n const sanitizedParsed = tryParse(sanitized);\n if (sanitizedParsed !== null) {\n return sanitizedParsed;\n }\n\n throw new Error(\"AI did not return valid JSON.\");\n}\n\nfunction stringifyField(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => stringifyField(item))\n .map((item) => item.trim())\n .filter(Boolean);\n }\n return stringifyField(value)\n .split(/\\n|,/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction toConfidence(value: unknown): number {\n if (typeof value === \"number\") {\n return Math.max(0, Math.min(1, value));\n }\n const parsed = Number(stringifyField(value));\n if (!Number.isNaN(parsed)) {\n return Math.max(0, Math.min(1, parsed));\n }\n return 0.5;\n}\n\nfunction normalizeResponseShape(payload: unknown): unknown {\n if (!payload || typeof payload !== \"object\") {\n return payload;\n }\n\n const data = payload as Record<string, unknown>;\n\n const commonCauses = toStringArray(data.common_causes);\n\n const hypothesesRaw = Array.isArray(data.hypotheses) ? data.hypotheses : [];\n const hypotheses = hypothesesRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n hypothesis: stringifyField(row?.hypothesis),\n confidence: toConfidence(row?.confidence),\n why: stringifyField(row?.why),\n };\n })\n .filter((item) => item.hypothesis && item.why)\n .slice(0, 3);\n\n const fixPlansRaw = Array.isArray(data.fix_plans) ? data.fix_plans : [];\n const normalizedFixPlans = fixPlansRaw\n .map((item, index) => {\n const row = item as Record<string, unknown>;\n const defaultPlan = index === 0 ? \"fast_patch\" : index === 1 ? \"proper_fix\" : \"long_term_fix\";\n const planText = stringifyField(row?.plan || defaultPlan).toLowerCase();\n const plan =\n planText === \"fast_patch\" || planText === \"proper_fix\" || planText === \"long_term_fix\"\n ? planText\n : defaultPlan;\n\n const tradeoffs = (row?.tradeoffs ?? {}) as Record<string, unknown>;\n return {\n plan,\n summary: stringifyField(row?.summary),\n steps: toStringArray(row?.steps),\n tradeoffs: {\n risk: stringifyField(tradeoffs.risk || \"Unknown\"),\n performance: stringifyField(tradeoffs.performance || \"Unknown\"),\n maintainability: stringifyField(tradeoffs.maintainability || \"Unknown\"),\n },\n };\n })\n .filter((item) => item.summary && item.steps.length > 0);\n\n const fixPlans =\n normalizedFixPlans.length >= 3\n ? normalizedFixPlans.slice(0, 3)\n : [\n {\n plan: \"fast_patch\",\n summary: stringifyField(data.fix),\n steps: [stringifyField(data.fix) || \"Apply a defensive guard around the failing line.\"],\n tradeoffs: {\n risk: \"May hide deeper data contract issues.\",\n performance: \"Minimal runtime overhead.\",\n maintainability: \"Good short-term, revisit for root-cause cleanup.\",\n },\n },\n {\n plan: \"proper_fix\",\n summary: \"Fix data flow and initialization path.\",\n steps: [\n \"Trace where the failing value is created.\",\n \"Initialize value before usage and add proper null checks.\",\n \"Add a regression test for this scenario.\",\n ],\n tradeoffs: {\n risk: \"Moderate code changes.\",\n performance: \"Neutral to slightly improved.\",\n maintainability: \"Better long-term readability and reliability.\",\n },\n },\n {\n plan: \"long_term_fix\",\n summary: \"Enforce stronger contracts and prevention tooling.\",\n steps: [\n \"Enable stricter type checks and lint rules.\",\n \"Introduce runtime validation for external inputs.\",\n \"Create reusable utility guards in shared modules.\",\n ],\n tradeoffs: {\n risk: \"Requires broader refactor.\",\n performance: \"Potential minor validation overhead.\",\n maintainability: \"Highest long-term stability.\",\n },\n },\n ];\n\n const frameworkRecipesRaw = Array.isArray(data.framework_recipes) ? data.framework_recipes : [];\n const frameworkRecipes = frameworkRecipesRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n framework: stringifyField(row?.framework),\n when_to_use: stringifyField(row?.when_to_use),\n steps: toStringArray(row?.steps),\n code_snippet: stringifyField(row?.code_snippet),\n };\n })\n .filter(\n (item) => item.framework && item.when_to_use && item.steps.length > 0 && item.code_snippet,\n );\n\n const remediationBlocksRaw = Array.isArray(data.remediation_blocks)\n ? data.remediation_blocks\n : [];\n const remediationBlocks = remediationBlocksRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n title: stringifyField(row?.title),\n commands: toStringArray(row?.commands),\n snippet: stringifyField(row?.snippet) || undefined,\n };\n })\n .filter((item) => item.title && item.commands.length > 0);\n\n const verifyChecklist = toStringArray(data.verify_checklist);\n\n const title = stringifyField(data.title);\n const explanation = stringifyField(data.explanation);\n const codeExample = stringifyField(data.code_example);\n const fix = stringifyField(data.fix);\n const likelyRootCause =\n stringifyField(data.likely_root_cause) ||\n commonCauses[0] ||\n \"Insufficient context from error text.\";\n\n return {\n title: title || \"Unknown error\",\n explanation: explanation || \"Unable to derive explanation from model response.\",\n common_causes:\n commonCauses.length > 0 ? commonCauses : [\"Insufficient context in provided error text.\"],\n fix: fix || \"Add guards and trace value initialization before the failing line.\",\n code_example: codeExample || \"// Add null checks around the failing line.\",\n eli5: stringifyField(data.eli5) || \"Your code expected one thing, but got something different.\",\n likely_root_cause: likelyRootCause,\n hypotheses:\n hypotheses.length > 0\n ? hypotheses\n : [\n {\n hypothesis: likelyRootCause,\n confidence: 0.6,\n why: \"Derived from error pattern and available context.\",\n },\n ],\n fix_plans: fixPlans,\n framework_recipes:\n frameworkRecipes.length > 0\n ? frameworkRecipes\n : [\n {\n framework: \"Node.js\",\n when_to_use: \"Default runtime fallback when framework is unknown.\",\n steps: [\n \"Validate all external data before use.\",\n \"Guard nullable values before method calls.\",\n \"Add test coverage for this failure path.\",\n ],\n code_snippet: \"const safeValue = input ?? defaultValue;\",\n },\n ],\n remediation_blocks:\n remediationBlocks.length > 0\n ? remediationBlocks\n : [\n {\n title: \"Quick remediation commands\",\n commands: [\"npm run test\", \"npm run lint\"],\n },\n ],\n verify_checklist:\n verifyChecklist.length > 0\n ? verifyChecklist\n : [\"Re-run failing command.\", \"Confirm no regression in related flows.\"],\n };\n}\n\nexport async function explainErrorWithAI(\n errorMessage: string,\n context: ExplainContext = {},\n): Promise<ExplainedError> {\n const apiKey = process.env.GROQ_API_KEY;\n if (!apiKey) {\n throw new Error(\n [\n \"Missing GROQ_API_KEY environment variable.\",\n \"\",\n \"Quick setup:\",\n \" macOS/Linux (zsh/bash):\",\n ' export GROQ_API_KEY=\"your_groq_api_key\"',\n \"\",\n \" Windows PowerShell:\",\n ' $env:GROQ_API_KEY=\"your_groq_api_key\"',\n \"\",\n \"Then run the CLI again.\",\n ].join(\"\\n\"),\n );\n }\n\n const prompt = `You are a senior software engineer helping debug errors with context.\nReturn STRICT JSON only (no markdown) with fields:\n- title\n- explanation\n- common_causes (string[])\n- fix\n- code_example\n- eli5\n- likely_root_cause\n- hypotheses (2-3 items): [{ hypothesis, confidence (0..1), why }]\n- fix_plans (exactly 3): [\n { plan: \"fast_patch\", summary, steps[], tradeoffs: { risk, performance, maintainability } },\n { plan: \"proper_fix\", summary, steps[], tradeoffs: { risk, performance, maintainability } },\n { plan: \"long_term_fix\", summary, steps[], tradeoffs: { risk, performance, maintainability } }\n]\n- framework_recipes (1+): [{ framework, when_to_use, steps[], code_snippet }]\n- remediation_blocks (1+): [{ title, commands[], snippet? }]\n- verify_checklist (string[])\n\nUse provided runtime/framework/code/stack context to produce context-aware likely root cause and framework-specific fixes.`;\n\n const contextBlock = [\n `Error message:\\n${errorMessage}`,\n `Runtime:\\n${context.runtime ?? \"unknown\"}`,\n `Framework:\\n${context.framework ?? \"unknown\"}`,\n `Stack trace:\\n${context.stackTrace ?? \"not provided\"}`,\n `Code snippet:\\n${context.codeSnippet ?? \"not provided\"}`,\n ].join(\"\\n\\n\");\n\n const requestBody = {\n messages: [\n { role: \"system\" as const, content: prompt },\n {\n role: \"user\" as const,\n content: `${contextBlock}\\n\\nReturn strict JSON only.`,\n },\n ],\n temperature: 0.2,\n };\n\n const requestConfig = {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n timeout: 30000,\n };\n\n let response: { data?: GroqChatResponse };\n try {\n response = await axios.post(\n GROQ_API_URL,\n { model: PRIMARY_GROQ_MODEL, ...requestBody },\n requestConfig,\n );\n } catch (error) {\n if (axios.isAxiosError(error)) {\n const providerMessage =\n typeof error.response?.data?.error?.message === \"string\"\n ? error.response.data.error.message\n : error.message;\n\n const isModelDecommissioned =\n providerMessage.toLowerCase().includes(\"decommissioned\") ||\n providerMessage.toLowerCase().includes(\"no longer supported\");\n\n if (isModelDecommissioned) {\n response = await axios.post(\n GROQ_API_URL,\n { model: FALLBACK_GROQ_MODEL, ...requestBody },\n requestConfig,\n );\n } else {\n throw new Error(`Groq API request failed: ${providerMessage}`);\n }\n } else {\n throw error;\n }\n }\n\n const content = response.data?.choices?.[0]?.message?.content;\n if (typeof content !== \"string\" || !content.trim()) {\n throw new Error(\"AI response was empty.\");\n }\n\n const parsed = extractJson(content);\n const normalized = normalizeResponseShape(parsed);\n return explainedErrorSchema.parse(normalized);\n}\n","import { z } from \"zod\";\n\nexport const hypothesisSchema = z.object({\n hypothesis: z.string().min(1),\n confidence: z.number().min(0).max(1),\n why: z.string().min(1),\n});\n\nexport const fixPlanSchema = z.object({\n plan: z.enum([\"fast_patch\", \"proper_fix\", \"long_term_fix\"]),\n summary: z.string().min(1),\n steps: z.array(z.string().min(1)).min(1),\n tradeoffs: z.object({\n risk: z.string().min(1),\n performance: z.string().min(1),\n maintainability: z.string().min(1),\n }),\n});\n\nexport const frameworkRecipeSchema = z.object({\n framework: z.string().min(1),\n when_to_use: z.string().min(1),\n steps: z.array(z.string().min(1)).min(1),\n code_snippet: z.string().min(1),\n});\n\nexport const remediationBlockSchema = z.object({\n title: z.string().min(1),\n commands: z.array(z.string().min(1)).min(1),\n snippet: z.string().optional(),\n});\n\nexport const explainedErrorSchema = z.object({\n title: z.string().min(1),\n explanation: z.string().min(1),\n common_causes: z.array(z.string().min(1)).min(1),\n fix: z.string().min(1),\n code_example: z.string().min(1),\n eli5: z.string().min(1),\n likely_root_cause: z.string().min(1),\n hypotheses: z.array(hypothesisSchema).min(1).max(3),\n fix_plans: z.array(fixPlanSchema).min(3),\n framework_recipes: z.array(frameworkRecipeSchema).min(1),\n remediation_blocks: z.array(remediationBlockSchema).min(1),\n verify_checklist: z.array(z.string().min(1)).min(1),\n});\n\nexport type ExplainedError = z.infer<typeof explainedErrorSchema>;\nexport type ExplainHypothesis = z.infer<typeof hypothesisSchema>;\nexport type FixPlan = z.infer<typeof fixPlanSchema>;\nexport type FrameworkRecipe = z.infer<typeof frameworkRecipeSchema>;\nexport type RemediationBlock = z.infer<typeof remediationBlockSchema>;\n\nexport type ExplainContext = {\n stackTrace?: string;\n codeSnippet?: string;\n runtime?: string;\n framework?: string;\n};\n","import pc from \"picocolors\";\nimport type { ExplainedError } from \"../types/error.js\";\n\nconst CARD_WIDTH = 72;\n\nfunction line(char = \"-\"): string {\n return char.repeat(CARD_WIDTH);\n}\n\nfunction pad(text: string): string {\n return text.length > CARD_WIDTH - 4 ? `${text.slice(0, CARD_WIDTH - 7)}...` : text;\n}\n\nfunction framedLine(text: string): string {\n return `| ${pad(text).padEnd(CARD_WIDTH - 4)} |`;\n}\n\nfunction block(title: string, body: string): string {\n const rows = body.split(\"\\n\").map((row) => pc.white(row));\n return [pc.cyan(line()), pc.bold(pc.cyan(title)), ...rows, pc.cyan(line())].join(\"\\n\");\n}\n\nfunction list(items: string[]): string {\n return items.map((item, index) => `${index + 1}. ${item}`).join(\"\\n\");\n}\n\nexport function formatExplainedError(result: ExplainedError): string {\n const commonCauses = list(result.common_causes);\n const hypotheses = result.hypotheses\n .map(\n (item, index) =>\n `${index + 1}. ${item.hypothesis}\\n confidence: ${(item.confidence * 100).toFixed(0)}%\\n why: ${item.why}`,\n )\n .join(\"\\n\\n\");\n const fixPlans = result.fix_plans\n .map((plan) => {\n const label =\n plan.plan === \"fast_patch\"\n ? \"Fast Patch\"\n : plan.plan === \"proper_fix\"\n ? \"Proper Fix\"\n : \"Long-Term Fix\";\n return [\n `${pc.bold(pc.green(label))}: ${plan.summary}`,\n ...plan.steps.map((step, index) => ` ${index + 1}. ${step}`),\n ` tradeoffs -> risk: ${plan.tradeoffs.risk}; performance: ${plan.tradeoffs.performance}; maintainability: ${plan.tradeoffs.maintainability}`,\n ].join(\"\\n\");\n })\n .join(\"\\n\\n\");\n const frameworkRecipes = result.framework_recipes\n .map((recipe) =>\n [\n `${pc.bold(pc.cyan(recipe.framework))}: ${recipe.when_to_use}`,\n ...recipe.steps.map((step, index) => ` ${index + 1}. ${step}`),\n \" snippet:\",\n recipe.code_snippet\n .split(\"\\n\")\n .map((lineText) => ` ${lineText}`)\n .join(\"\\n\"),\n ].join(\"\\n\"),\n )\n .join(\"\\n\\n\");\n const remediationBlocks = result.remediation_blocks\n .map((blockItem) => {\n const snippet = blockItem.snippet?.trim()\n ? `\\n snippet:\\n${blockItem.snippet\n .split(\"\\n\")\n .map((lineText) => ` ${lineText}`)\n .join(\"\\n\")}`\n : \"\";\n return (\n [\n `${pc.bold(pc.green(blockItem.title))}`,\n ...blockItem.commands.map((command) => ` $ ${command}`),\n ].join(\"\\n\") + snippet\n );\n })\n .join(\"\\n\\n\");\n const verifyChecklist = list(result.verify_checklist);\n const hero = [\n pc.cyan(line(\"=\")),\n framedLine(pc.bold(pc.cyan(\"EXPLAIN MY ERROR\"))),\n framedLine(pc.dim(\"AI powered debugging for humans\")),\n pc.cyan(line(\"=\")),\n ].join(\"\\n\");\n\n return [\n hero,\n \"\",\n `${pc.bold(pc.cyan(\"ERROR\"))}: ${pc.bold(pc.white(result.title))}`,\n `${pc.bold(pc.yellow(\"LIKELY ROOT CAUSE\"))}: ${pc.white(result.likely_root_cause)}`,\n \"\",\n block(\"EXPLANATION\", result.explanation),\n \"\",\n block(\"COMMON CAUSES\", commonCauses),\n \"\",\n block(\"HYPOTHESES (WITH CONFIDENCE)\", hypotheses),\n \"\",\n block(\"RANKED FIX PLANS\", fixPlans),\n \"\",\n `${pc.bold(pc.green(\"FIX\"))}\\n${pc.white(result.fix)}`,\n \"\",\n block(\"CODE EXAMPLE\", result.code_example),\n \"\",\n block(\"FRAMEWORK-SPECIFIC RECIPES\", frameworkRecipes),\n \"\",\n block(\"COPY-PASTE REMEDIATION\", remediationBlocks),\n \"\",\n block(\"VERIFY CHECKLIST\", verifyChecklist),\n \"\",\n block(\"ELI5\", result.eli5),\n \"\",\n pc.dim('Tip: run `eme explain \"<error>\"` for quick mode.'),\n ].join(\"\\n\");\n}\n","import pc from \"picocolors\";\n\nexport const logger = {\n info(message: string): void {\n process.stdout.write(`${pc.white(message)}\\n`);\n },\n success(message: string): void {\n process.stdout.write(`${pc.green(`OK: ${message}`)}\\n`);\n },\n warn(message: string): void {\n process.stderr.write(`${pc.yellow(`WARN: ${message}`)}\\n`);\n },\n error(message: string): void {\n process.stderr.write(`${pc.red(`ERROR: ${message}`)}\\n`);\n },\n};\n","import { explainErrorWithAI } from \"./services/ai.js\";\nimport type { ExplainContext, ExplainedError } from \"./types/error.js\";\n\nexport async function explainError(\n errorMessage: string,\n context: ExplainContext = {},\n): Promise<ExplainedError> {\n return explainErrorWithAI(errorMessage, context);\n}\n","import { z } from \"zod\";\nimport { explainErrorWithAI } from \"../services/ai.js\";\nimport type { ExplainedError } from \"../types/error.js\";\n\nconst explainErrorSkillInputSchema = z.object({\n error: z.string().min(1, \"error is required\"),\n stack_trace: z.string().optional(),\n code_snippet: z.string().optional(),\n runtime: z.string().optional(),\n framework: z.string().optional(),\n});\n\nexport type ExplainErrorSkillInput = z.infer<typeof explainErrorSkillInputSchema>;\n\nexport async function runExplainErrorSkill(input: ExplainErrorSkillInput): Promise<ExplainedError> {\n const parsedInput = explainErrorSkillInputSchema.parse(input);\n return explainErrorWithAI(parsedInput.error, {\n stackTrace: parsedInput.stack_trace,\n codeSnippet: parsedInput.code_snippet,\n runtime: parsedInput.runtime,\n framework: parsedInput.framework,\n });\n}\n"],"mappings":"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","names":["pc","pc","explainError","require","pc","z","z"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/explain.ts","../src/services/ai.ts","../src/types/error.ts","../src/utils/formatter.ts","../src/utils/logger.ts","../src/explain.ts","../src/skills/explainError.skill.ts"],"sourcesContent":["import { access, readFile, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { createInterface } from \"node:readline/promises\";\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { type ExplainCommandOptions, runExplainCommand } from \"./commands/explain.js\";\nimport type { ExplainContext } from \"./types/error.js\";\nimport { logger } from \"./utils/logger.js\";\n\nconst require = createRequire(import.meta.url);\n\nfunction getCliVersion(): string {\n try {\n const pkg = require(\"../package.json\") as { version?: string };\n return pkg.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n return \"\";\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\").trim();\n}\n\nasync function safeReadText(filePath: string | undefined): Promise<string | undefined> {\n if (!filePath) {\n return undefined;\n }\n try {\n return await readFile(filePath, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\nasync function detectFrameworkFromPackageJson(): Promise<string | undefined> {\n try {\n const raw = await readFile(\"package.json\", \"utf8\");\n const pkg = JSON.parse(raw) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n if (\"next\" in deps) return \"Next.js\";\n if (\"react\" in deps) return \"React\";\n if (\"express\" in deps) return \"Express\";\n if (\"typescript\" in deps) return \"TypeScript\";\n if (\"fastify\" in deps) return \"Fastify\";\n if (\"nestjs\" in deps || \"@nestjs/core\" in deps) return \"NestJS\";\n } catch {\n // Best-effort auto-detection.\n }\n return undefined;\n}\n\ntype ExplainCliOptions = {\n json?: boolean;\n stack?: string;\n stackFile?: string;\n code?: string;\n codeFile?: string;\n runtime?: string;\n framework?: string;\n};\n\nasync function buildExplainOptions(options: ExplainCliOptions): Promise<ExplainCommandOptions> {\n const stackFromFile = await safeReadText(options.stackFile);\n const codeFromFile = await safeReadText(options.codeFile);\n const detectedFramework = await detectFrameworkFromPackageJson();\n\n const context: ExplainContext = {\n stackTrace: options.stack ?? stackFromFile,\n codeSnippet: options.code ?? codeFromFile,\n runtime: options.runtime ?? `Node ${process.version}`,\n framework: options.framework ?? detectedFramework ?? \"unknown\",\n };\n\n return {\n output: options.json ? \"json\" : \"pretty\",\n context,\n };\n}\n\nasync function promptForError(): Promise<string> {\n if (!process.stdin.isTTY) {\n return \"\";\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n logger.info(pc.cyan(\"Paste an error message and press Enter.\"));\n logger.info(pc.dim('Example: TypeError: Cannot read property \"map\" of undefined'));\n while (true) {\n const answer = await rl.question(pc.bold(pc.cyan(\"\\n> Error message: \")));\n const trimmed = answer.trim();\n\n if (trimmed) {\n return trimmed;\n }\n\n logger.warn(\"Error message cannot be empty. Please try again.\");\n }\n } finally {\n rl.close();\n }\n}\n\nasync function upsertEnvVar(filePath: string, key: string, value: string): Promise<void> {\n let existing = \"\";\n try {\n await access(filePath);\n existing = await readFile(filePath, \"utf8\");\n } catch {\n existing = \"\";\n }\n\n const envLine = `${key}=${value}`;\n const keyPattern = new RegExp(`^${key}=.*$`, \"m\");\n let nextContent: string;\n\n if (keyPattern.test(existing)) {\n nextContent = existing.replace(keyPattern, envLine);\n } else if (!existing.trim()) {\n nextContent = `${envLine}\\n`;\n } else {\n const needsTrailingNewline = !existing.endsWith(\"\\n\");\n nextContent = `${existing}${needsTrailingNewline ? \"\\n\" : \"\"}${envLine}\\n`;\n }\n\n await writeFile(filePath, nextContent, \"utf8\");\n}\n\nasync function ensureGroqApiKey(): Promise<boolean> {\n if (process.env.GROQ_API_KEY?.trim()) {\n return true;\n }\n\n if (!process.stdin.isTTY) {\n return false;\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n logger.warn(\"GROQ_API_KEY is missing.\");\n logger.info(pc.cyan(\"Paste your Groq API key to continue.\"));\n\n while (true) {\n const key = (await rl.question(pc.bold(pc.cyan(\"\\n> GROQ_API_KEY: \")))).trim();\n if (!key) {\n logger.warn(\"API key cannot be empty. Please try again.\");\n continue;\n }\n\n process.env.GROQ_API_KEY = key;\n\n const saveAnswer = (\n await rl.question(pc.dim(\"Save this key to .env in current directory? (Y/n): \"))\n )\n .trim()\n .toLowerCase();\n const shouldSave = saveAnswer === \"\" || saveAnswer === \"y\" || saveAnswer === \"yes\";\n\n if (shouldSave) {\n try {\n await upsertEnvVar(\".env\", \"GROQ_API_KEY\", key);\n logger.success(\"Saved GROQ_API_KEY to .env\");\n } catch {\n logger.warn(\"Could not save key to .env, but this session will continue.\");\n }\n }\n\n return true;\n }\n } finally {\n rl.close();\n }\n}\n\ntype CliLogger = {\n warn(message: string): void;\n};\n\ntype RunCliDeps = {\n runExplain?: (errorMessage: string, options?: ExplainCommandOptions) => Promise<void>;\n readStdin?: () => Promise<string>;\n promptForError?: () => Promise<string>;\n stdinIsTTY?: () => boolean;\n ensureApiKey?: () => Promise<boolean>;\n log?: CliLogger;\n};\n\nexport async function runCli(argv: string[] = process.argv, deps: RunCliDeps = {}): Promise<void> {\n const runExplain = deps.runExplain ?? runExplainCommand;\n const readStdinFn = deps.readStdin ?? readStdin;\n const promptForErrorFn = deps.promptForError ?? promptForError;\n const stdinIsTTY = deps.stdinIsTTY ?? (() => Boolean(process.stdin.isTTY));\n const ensureApiKeyFn =\n deps.ensureApiKey ?? (deps.runExplain ? async () => true : ensureGroqApiKey);\n const log = deps.log ?? logger;\n\n const program = new Command();\n\n program\n .name(\"explain-my-error\")\n .description(\"Explain programming errors with AI\")\n .version(getCliVersion())\n .addHelpText(\n \"after\",\n `\nInput modes:\n 1) Interactive (default)\n $ explain-my-error\n $ eme\n\n 2) Inline argument\n $ explain-my-error explain \"TypeError: Cannot read property 'map' of undefined\"\n $ eme explain \"ReferenceError: x is not defined\"\n\n 3) Pipe from files/commands\n $ cat error.txt | explain-my-error\n $ pnpm run build 2>&1 | eme\n\nPower features:\n - Context-aware analysis: pass stack traces, code snippets, runtime, and framework.\n - Structured output: use --json for machine-readable responses.\n - Auto framework detection: best-effort detection from local package.json.\n`,\n );\n\n program\n .command(\"explain\")\n .description(\"Explain a programming error message\")\n .argument(\"[error...]\", \"Error message to analyze\")\n .option(\"--json\", \"Output structured JSON\")\n .option(\"--stack <stackTrace>\", \"Additional stack trace context\")\n .option(\"--stack-file <path>\", \"Read stack trace from a file\")\n .option(\"--code <codeSnippet>\", \"Additional code snippet context\")\n .option(\"--code-file <path>\", \"Read code snippet from a file\")\n .option(\"--runtime <runtime>\", \"Runtime context (example: node 20, bun 1.1)\")\n .option(\"--framework <framework>\", \"Framework context (example: react, nextjs, express)\")\n .addHelpText(\n \"after\",\n `\nContext options:\n --stack inline stack trace text\n --stack-file file path for stack trace\n --code inline code snippet text\n --code-file file path for code snippet\n --runtime runtime label (default: current Node version)\n --framework framework label (auto-detected when possible)\n\nOutput modes:\n default pretty output includes:\n - likely root cause\n - 2-3 hypotheses with confidence\n - ranked fix plans (fast/proper/long-term) with tradeoffs\n - framework-specific recipes\n - remediation commands and verify checklist\n\n --json output includes the same data in machine-readable JSON.\n\nExamples:\n $ explain-my-error explain \"SyntaxError: Unexpected token }\"\n $ eme explain \"Module not found: Can't resolve 'axios'\"\n $ cat error.txt | explain-my-error explain\n $ eme explain \"TypeError: Cannot read property 'map' of undefined\" --framework react --runtime \"node 20\"\n $ eme explain --stack-file ./error.log --code-file ./src/app.ts --json\n`,\n )\n .action(async (errorParts: string[], options: ExplainCliOptions) => {\n const inlineError = errorParts.join(\" \").trim();\n const pipedError = inlineError ? \"\" : await readStdinFn();\n const promptedError = !inlineError && !pipedError ? await promptForErrorFn() : \"\";\n const finalError = inlineError || pipedError || promptedError;\n const explainOptions = await buildExplainOptions(options);\n const hasApiKey = await ensureApiKeyFn();\n if (!hasApiKey) {\n log.warn(\"GROQ_API_KEY is required. Set it and run again.\");\n return;\n }\n await runExplain(finalError, explainOptions);\n });\n\n program.action(async () => {\n if (stdinIsTTY()) {\n const promptedError = await promptForErrorFn();\n await runExplain(promptedError, await buildExplainOptions({}));\n return;\n }\n\n const pipedError = await readStdinFn();\n if (!pipedError) {\n log.warn('No input detected. Use: explain-my-error explain \"<error message>\"');\n return;\n }\n\n const hasApiKey = await ensureApiKeyFn();\n if (!hasApiKey) {\n log.warn(\"GROQ_API_KEY is required. Set it and run again.\");\n return;\n }\n\n await runExplain(pipedError, await buildExplainOptions({}));\n });\n\n await program.parseAsync(argv);\n}\n","import ora from \"ora\";\nimport { explainErrorWithAI } from \"../services/ai.js\";\nimport type { ExplainContext, ExplainedError } from \"../types/error.js\";\nimport { formatExplainedError } from \"../utils/formatter.js\";\nimport { logger } from \"../utils/logger.js\";\n\ntype SpinnerLike = {\n succeed(text: string): void;\n fail(text: string): void;\n};\n\ntype ExplainLogger = {\n info(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n};\n\ntype RunExplainDeps = {\n explainError?: (errorMessage: string, context?: ExplainContext) => Promise<ExplainedError>;\n createSpinner?: (text: string) => SpinnerLike;\n formatOutput?: (result: ExplainedError) => string;\n log?: ExplainLogger;\n};\n\nexport type ExplainCommandOptions = {\n output: \"pretty\" | \"json\";\n context?: ExplainContext;\n};\n\nfunction isDepsObject(value: unknown): value is RunExplainDeps {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n return (\n \"explainError\" in candidate ||\n \"createSpinner\" in candidate ||\n \"formatOutput\" in candidate ||\n \"log\" in candidate\n );\n}\n\nexport async function runExplainCommand(\n errorMessage: string,\n optionsOrDeps: ExplainCommandOptions | RunExplainDeps = { output: \"pretty\" },\n depsArg: RunExplainDeps = {},\n): Promise<void> {\n const options = isDepsObject(optionsOrDeps) ? { output: \"pretty\" as const } : optionsOrDeps;\n const deps = isDepsObject(optionsOrDeps) ? optionsOrDeps : depsArg;\n\n const explainError = deps.explainError ?? explainErrorWithAI;\n const createSpinner = deps.createSpinner ?? ((text: string) => ora(text).start());\n const formatOutput = deps.formatOutput ?? formatExplainedError;\n const log = deps.log ?? logger;\n\n if (!errorMessage?.trim()) {\n log.warn(\"Please provide an error message.\");\n return;\n }\n\n const spinner = createSpinner(\"Analyzing your error...\");\n\n try {\n const result = await explainError(errorMessage.trim(), options.context);\n spinner.succeed(\"Explanation ready.\");\n log.info(\"\");\n if (options.output === \"json\") {\n log.info(JSON.stringify(result, null, 2));\n } else {\n log.info(formatOutput(result));\n }\n } catch (error) {\n spinner.fail(\"Could not explain this error.\");\n const message = error instanceof Error ? error.message : \"Unknown error\";\n log.error(message);\n }\n}\n","import axios from \"axios\";\nimport { type ExplainContext, type ExplainedError, explainedErrorSchema } from \"../types/error.js\";\n\nconst GROQ_API_URL = \"https://api.groq.com/openai/v1/chat/completions\";\nconst PRIMARY_GROQ_MODEL = \"llama3-70b-8192\";\nconst FALLBACK_GROQ_MODEL = process.env.GROQ_FALLBACK_MODEL ?? \"llama-3.3-70b-versatile\";\n\ntype GroqChatResponse = {\n choices?: Array<{ message?: { content?: string } }>;\n};\n\nfunction extractJson(content: string): unknown {\n const trimmed = content.trim();\n\n const tryParse = (input: string): unknown | null => {\n try {\n return JSON.parse(input);\n } catch {\n return null;\n }\n };\n\n const sanitizeControlCharsInStrings = (input: string): string => {\n let result = \"\";\n let inString = false;\n let escaping = false;\n\n for (let i = 0; i < input.length; i += 1) {\n const ch = input[i];\n\n if (!inString) {\n result += ch;\n if (ch === '\"') {\n inString = true;\n }\n continue;\n }\n\n if (escaping) {\n result += ch;\n escaping = false;\n continue;\n }\n\n if (ch === \"\\\\\") {\n result += ch;\n escaping = true;\n continue;\n }\n\n if (ch === '\"') {\n result += ch;\n inString = false;\n continue;\n }\n\n if (ch === \"\\n\") {\n result += \"\\\\n\";\n continue;\n }\n if (ch === \"\\r\") {\n result += \"\\\\r\";\n continue;\n }\n if (ch === \"\\t\") {\n result += \"\\\\t\";\n continue;\n }\n\n const code = ch.charCodeAt(0);\n if (code < 0x20) {\n result += `\\\\u${code.toString(16).padStart(4, \"0\")}`;\n continue;\n }\n\n result += ch;\n }\n\n return result;\n };\n\n const direct = tryParse(trimmed);\n if (direct !== null) {\n return direct;\n }\n\n const match = trimmed.match(/\\{[\\s\\S]*\\}/);\n if (!match) {\n throw new Error(\"AI did not return valid JSON.\");\n }\n\n const extracted = match[0];\n const extractedParsed = tryParse(extracted);\n if (extractedParsed !== null) {\n return extractedParsed;\n }\n\n const sanitized = sanitizeControlCharsInStrings(extracted);\n const sanitizedParsed = tryParse(sanitized);\n if (sanitizedParsed !== null) {\n return sanitizedParsed;\n }\n\n throw new Error(\"AI did not return valid JSON.\");\n}\n\nfunction stringifyField(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => stringifyField(item))\n .map((item) => item.trim())\n .filter(Boolean);\n }\n return stringifyField(value)\n .split(/\\n|,/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction toConfidence(value: unknown): number {\n if (typeof value === \"number\") {\n return Math.max(0, Math.min(1, value));\n }\n const parsed = Number(stringifyField(value));\n if (!Number.isNaN(parsed)) {\n return Math.max(0, Math.min(1, parsed));\n }\n return 0.5;\n}\n\nfunction normalizeResponseShape(payload: unknown): unknown {\n if (!payload || typeof payload !== \"object\") {\n return payload;\n }\n\n const data = payload as Record<string, unknown>;\n\n const commonCauses = toStringArray(data.common_causes);\n\n const hypothesesRaw = Array.isArray(data.hypotheses) ? data.hypotheses : [];\n const hypotheses = hypothesesRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n hypothesis: stringifyField(row?.hypothesis),\n confidence: toConfidence(row?.confidence),\n why: stringifyField(row?.why),\n };\n })\n .filter((item) => item.hypothesis && item.why)\n .slice(0, 3);\n\n const fixPlansRaw = Array.isArray(data.fix_plans) ? data.fix_plans : [];\n const normalizedFixPlans = fixPlansRaw\n .map((item, index) => {\n const row = item as Record<string, unknown>;\n const defaultPlan = index === 0 ? \"fast_patch\" : index === 1 ? \"proper_fix\" : \"long_term_fix\";\n const planText = stringifyField(row?.plan || defaultPlan).toLowerCase();\n const plan =\n planText === \"fast_patch\" || planText === \"proper_fix\" || planText === \"long_term_fix\"\n ? planText\n : defaultPlan;\n\n const tradeoffs = (row?.tradeoffs ?? {}) as Record<string, unknown>;\n return {\n plan,\n summary: stringifyField(row?.summary),\n steps: toStringArray(row?.steps),\n tradeoffs: {\n risk: stringifyField(tradeoffs.risk || \"Unknown\"),\n performance: stringifyField(tradeoffs.performance || \"Unknown\"),\n maintainability: stringifyField(tradeoffs.maintainability || \"Unknown\"),\n },\n };\n })\n .filter((item) => item.summary && item.steps.length > 0);\n\n const fixPlans =\n normalizedFixPlans.length >= 3\n ? normalizedFixPlans.slice(0, 3)\n : [\n {\n plan: \"fast_patch\",\n summary: stringifyField(data.fix),\n steps: [stringifyField(data.fix) || \"Apply a defensive guard around the failing line.\"],\n tradeoffs: {\n risk: \"May hide deeper data contract issues.\",\n performance: \"Minimal runtime overhead.\",\n maintainability: \"Good short-term, revisit for root-cause cleanup.\",\n },\n },\n {\n plan: \"proper_fix\",\n summary: \"Fix data flow and initialization path.\",\n steps: [\n \"Trace where the failing value is created.\",\n \"Initialize value before usage and add proper null checks.\",\n \"Add a regression test for this scenario.\",\n ],\n tradeoffs: {\n risk: \"Moderate code changes.\",\n performance: \"Neutral to slightly improved.\",\n maintainability: \"Better long-term readability and reliability.\",\n },\n },\n {\n plan: \"long_term_fix\",\n summary: \"Enforce stronger contracts and prevention tooling.\",\n steps: [\n \"Enable stricter type checks and lint rules.\",\n \"Introduce runtime validation for external inputs.\",\n \"Create reusable utility guards in shared modules.\",\n ],\n tradeoffs: {\n risk: \"Requires broader refactor.\",\n performance: \"Potential minor validation overhead.\",\n maintainability: \"Highest long-term stability.\",\n },\n },\n ];\n\n const frameworkRecipesRaw = Array.isArray(data.framework_recipes) ? data.framework_recipes : [];\n const frameworkRecipes = frameworkRecipesRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n framework: stringifyField(row?.framework),\n when_to_use: stringifyField(row?.when_to_use),\n steps: toStringArray(row?.steps),\n code_snippet: stringifyField(row?.code_snippet),\n };\n })\n .filter(\n (item) => item.framework && item.when_to_use && item.steps.length > 0 && item.code_snippet,\n );\n\n const remediationBlocksRaw = Array.isArray(data.remediation_blocks)\n ? data.remediation_blocks\n : [];\n const remediationBlocks = remediationBlocksRaw\n .map((item) => {\n const row = item as Record<string, unknown>;\n return {\n title: stringifyField(row?.title),\n commands: toStringArray(row?.commands),\n snippet: stringifyField(row?.snippet) || undefined,\n };\n })\n .filter((item) => item.title && item.commands.length > 0);\n\n const verifyChecklist = toStringArray(data.verify_checklist);\n\n const title = stringifyField(data.title);\n const explanation = stringifyField(data.explanation);\n const codeExample = stringifyField(data.code_example);\n const fix = stringifyField(data.fix);\n const likelyRootCause =\n stringifyField(data.likely_root_cause) ||\n commonCauses[0] ||\n \"Insufficient context from error text.\";\n\n return {\n title: title || \"Unknown error\",\n explanation: explanation || \"Unable to derive explanation from model response.\",\n common_causes:\n commonCauses.length > 0 ? commonCauses : [\"Insufficient context in provided error text.\"],\n fix: fix || \"Add guards and trace value initialization before the failing line.\",\n code_example: codeExample || \"// Add null checks around the failing line.\",\n eli5: stringifyField(data.eli5) || \"Your code expected one thing, but got something different.\",\n likely_root_cause: likelyRootCause,\n hypotheses:\n hypotheses.length > 0\n ? hypotheses\n : [\n {\n hypothesis: likelyRootCause,\n confidence: 0.6,\n why: \"Derived from error pattern and available context.\",\n },\n ],\n fix_plans: fixPlans,\n framework_recipes:\n frameworkRecipes.length > 0\n ? frameworkRecipes\n : [\n {\n framework: \"Node.js\",\n when_to_use: \"Default runtime fallback when framework is unknown.\",\n steps: [\n \"Validate all external data before use.\",\n \"Guard nullable values before method calls.\",\n \"Add test coverage for this failure path.\",\n ],\n code_snippet: \"const safeValue = input ?? defaultValue;\",\n },\n ],\n remediation_blocks:\n remediationBlocks.length > 0\n ? remediationBlocks\n : [\n {\n title: \"Quick remediation commands\",\n commands: [\"npm run test\", \"npm run lint\"],\n },\n ],\n verify_checklist:\n verifyChecklist.length > 0\n ? verifyChecklist\n : [\"Re-run failing command.\", \"Confirm no regression in related flows.\"],\n };\n}\n\nexport async function explainErrorWithAI(\n errorMessage: string,\n context: ExplainContext = {},\n): Promise<ExplainedError> {\n const apiKey = process.env.GROQ_API_KEY;\n if (!apiKey) {\n throw new Error(\n [\n \"Missing GROQ_API_KEY environment variable.\",\n \"\",\n \"Quick setup:\",\n \" macOS/Linux (zsh/bash):\",\n ' export GROQ_API_KEY=\"your_groq_api_key\"',\n \"\",\n \" Windows PowerShell:\",\n ' $env:GROQ_API_KEY=\"your_groq_api_key\"',\n \"\",\n \"Then run the CLI again.\",\n ].join(\"\\n\"),\n );\n }\n\n const prompt = `You are a senior software engineer helping debug errors with context.\nReturn STRICT JSON only (no markdown) with fields:\n- title\n- explanation\n- common_causes (string[])\n- fix\n- code_example\n- eli5\n- likely_root_cause\n- hypotheses (2-3 items): [{ hypothesis, confidence (0..1), why }]\n- fix_plans (exactly 3): [\n { plan: \"fast_patch\", summary, steps[], tradeoffs: { risk, performance, maintainability } },\n { plan: \"proper_fix\", summary, steps[], tradeoffs: { risk, performance, maintainability } },\n { plan: \"long_term_fix\", summary, steps[], tradeoffs: { risk, performance, maintainability } }\n]\n- framework_recipes (1+): [{ framework, when_to_use, steps[], code_snippet }]\n- remediation_blocks (1+): [{ title, commands[], snippet? }]\n- verify_checklist (string[])\n\nUse provided runtime/framework/code/stack context to produce context-aware likely root cause and framework-specific fixes.`;\n\n const contextBlock = [\n `Error message:\\n${errorMessage}`,\n `Runtime:\\n${context.runtime ?? \"unknown\"}`,\n `Framework:\\n${context.framework ?? \"unknown\"}`,\n `Stack trace:\\n${context.stackTrace ?? \"not provided\"}`,\n `Code snippet:\\n${context.codeSnippet ?? \"not provided\"}`,\n ].join(\"\\n\\n\");\n\n const requestBody = {\n messages: [\n { role: \"system\" as const, content: prompt },\n {\n role: \"user\" as const,\n content: `${contextBlock}\\n\\nReturn strict JSON only.`,\n },\n ],\n temperature: 0.2,\n };\n\n const requestConfig = {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n timeout: 30000,\n };\n\n let response: { data?: GroqChatResponse };\n try {\n response = await axios.post(\n GROQ_API_URL,\n { model: PRIMARY_GROQ_MODEL, ...requestBody },\n requestConfig,\n );\n } catch (error) {\n if (axios.isAxiosError(error)) {\n const providerMessage =\n typeof error.response?.data?.error?.message === \"string\"\n ? error.response.data.error.message\n : error.message;\n\n const isModelDecommissioned =\n providerMessage.toLowerCase().includes(\"decommissioned\") ||\n providerMessage.toLowerCase().includes(\"no longer supported\");\n\n if (isModelDecommissioned) {\n response = await axios.post(\n GROQ_API_URL,\n { model: FALLBACK_GROQ_MODEL, ...requestBody },\n requestConfig,\n );\n } else {\n throw new Error(`Groq API request failed: ${providerMessage}`);\n }\n } else {\n throw error;\n }\n }\n\n const content = response.data?.choices?.[0]?.message?.content;\n if (typeof content !== \"string\" || !content.trim()) {\n throw new Error(\"AI response was empty.\");\n }\n\n const parsed = extractJson(content);\n const normalized = normalizeResponseShape(parsed);\n return explainedErrorSchema.parse(normalized);\n}\n","import { z } from \"zod\";\n\nexport const hypothesisSchema = z.object({\n hypothesis: z.string().min(1),\n confidence: z.number().min(0).max(1),\n why: z.string().min(1),\n});\n\nexport const fixPlanSchema = z.object({\n plan: z.enum([\"fast_patch\", \"proper_fix\", \"long_term_fix\"]),\n summary: z.string().min(1),\n steps: z.array(z.string().min(1)).min(1),\n tradeoffs: z.object({\n risk: z.string().min(1),\n performance: z.string().min(1),\n maintainability: z.string().min(1),\n }),\n});\n\nexport const frameworkRecipeSchema = z.object({\n framework: z.string().min(1),\n when_to_use: z.string().min(1),\n steps: z.array(z.string().min(1)).min(1),\n code_snippet: z.string().min(1),\n});\n\nexport const remediationBlockSchema = z.object({\n title: z.string().min(1),\n commands: z.array(z.string().min(1)).min(1),\n snippet: z.string().optional(),\n});\n\nexport const explainedErrorSchema = z.object({\n title: z.string().min(1),\n explanation: z.string().min(1),\n common_causes: z.array(z.string().min(1)).min(1),\n fix: z.string().min(1),\n code_example: z.string().min(1),\n eli5: z.string().min(1),\n likely_root_cause: z.string().min(1),\n hypotheses: z.array(hypothesisSchema).min(1).max(3),\n fix_plans: z.array(fixPlanSchema).min(3),\n framework_recipes: z.array(frameworkRecipeSchema).min(1),\n remediation_blocks: z.array(remediationBlockSchema).min(1),\n verify_checklist: z.array(z.string().min(1)).min(1),\n});\n\nexport type ExplainedError = z.infer<typeof explainedErrorSchema>;\nexport type ExplainHypothesis = z.infer<typeof hypothesisSchema>;\nexport type FixPlan = z.infer<typeof fixPlanSchema>;\nexport type FrameworkRecipe = z.infer<typeof frameworkRecipeSchema>;\nexport type RemediationBlock = z.infer<typeof remediationBlockSchema>;\n\nexport type ExplainContext = {\n stackTrace?: string;\n codeSnippet?: string;\n runtime?: string;\n framework?: string;\n};\n","import pc from \"picocolors\";\nimport type { ExplainedError } from \"../types/error.js\";\n\nconst CARD_WIDTH = 72;\n\nfunction line(char = \"-\"): string {\n return char.repeat(CARD_WIDTH);\n}\n\nfunction pad(text: string): string {\n return text.length > CARD_WIDTH - 4 ? `${text.slice(0, CARD_WIDTH - 7)}...` : text;\n}\n\nfunction framedLine(text: string): string {\n return `| ${pad(text).padEnd(CARD_WIDTH - 4)} |`;\n}\n\nfunction block(title: string, body: string): string {\n const rows = body.split(\"\\n\").map((row) => pc.white(row));\n return [pc.cyan(line()), pc.bold(pc.cyan(title)), ...rows, pc.cyan(line())].join(\"\\n\");\n}\n\nfunction list(items: string[]): string {\n return items.map((item, index) => `${index + 1}. ${item}`).join(\"\\n\");\n}\n\nexport function formatExplainedError(result: ExplainedError): string {\n const commonCauses = list(result.common_causes);\n const hypotheses = result.hypotheses\n .map(\n (item, index) =>\n `${index + 1}. ${item.hypothesis}\\n confidence: ${(item.confidence * 100).toFixed(0)}%\\n why: ${item.why}`,\n )\n .join(\"\\n\\n\");\n const fixPlans = result.fix_plans\n .map((plan) => {\n const label =\n plan.plan === \"fast_patch\"\n ? \"Fast Patch\"\n : plan.plan === \"proper_fix\"\n ? \"Proper Fix\"\n : \"Long-Term Fix\";\n return [\n `${pc.bold(pc.green(label))}: ${plan.summary}`,\n ...plan.steps.map((step, index) => ` ${index + 1}. ${step}`),\n ` tradeoffs -> risk: ${plan.tradeoffs.risk}; performance: ${plan.tradeoffs.performance}; maintainability: ${plan.tradeoffs.maintainability}`,\n ].join(\"\\n\");\n })\n .join(\"\\n\\n\");\n const frameworkRecipes = result.framework_recipes\n .map((recipe) =>\n [\n `${pc.bold(pc.cyan(recipe.framework))}: ${recipe.when_to_use}`,\n ...recipe.steps.map((step, index) => ` ${index + 1}. ${step}`),\n \" snippet:\",\n recipe.code_snippet\n .split(\"\\n\")\n .map((lineText) => ` ${lineText}`)\n .join(\"\\n\"),\n ].join(\"\\n\"),\n )\n .join(\"\\n\\n\");\n const remediationBlocks = result.remediation_blocks\n .map((blockItem) => {\n const snippet = blockItem.snippet?.trim()\n ? `\\n snippet:\\n${blockItem.snippet\n .split(\"\\n\")\n .map((lineText) => ` ${lineText}`)\n .join(\"\\n\")}`\n : \"\";\n return (\n [\n `${pc.bold(pc.green(blockItem.title))}`,\n ...blockItem.commands.map((command) => ` $ ${command}`),\n ].join(\"\\n\") + snippet\n );\n })\n .join(\"\\n\\n\");\n const verifyChecklist = list(result.verify_checklist);\n const hero = [\n pc.cyan(line(\"=\")),\n framedLine(pc.bold(pc.cyan(\"EXPLAIN MY ERROR\"))),\n framedLine(pc.dim(\"AI powered debugging for humans\")),\n pc.cyan(line(\"=\")),\n ].join(\"\\n\");\n\n return [\n hero,\n \"\",\n `${pc.bold(pc.cyan(\"ERROR\"))}: ${pc.bold(pc.white(result.title))}`,\n `${pc.bold(pc.yellow(\"LIKELY ROOT CAUSE\"))}: ${pc.white(result.likely_root_cause)}`,\n \"\",\n block(\"EXPLANATION\", result.explanation),\n \"\",\n block(\"COMMON CAUSES\", commonCauses),\n \"\",\n block(\"HYPOTHESES (WITH CONFIDENCE)\", hypotheses),\n \"\",\n block(\"RANKED FIX PLANS\", fixPlans),\n \"\",\n `${pc.bold(pc.green(\"FIX\"))}\\n${pc.white(result.fix)}`,\n \"\",\n block(\"CODE EXAMPLE\", result.code_example),\n \"\",\n block(\"FRAMEWORK-SPECIFIC RECIPES\", frameworkRecipes),\n \"\",\n block(\"COPY-PASTE REMEDIATION\", remediationBlocks),\n \"\",\n block(\"VERIFY CHECKLIST\", verifyChecklist),\n \"\",\n block(\"ELI5\", result.eli5),\n \"\",\n pc.dim('Tip: run `eme explain \"<error>\"` for quick mode.'),\n ].join(\"\\n\");\n}\n","import pc from \"picocolors\";\n\nexport const logger = {\n info(message: string): void {\n process.stdout.write(`${pc.white(message)}\\n`);\n },\n success(message: string): void {\n process.stdout.write(`${pc.green(`OK: ${message}`)}\\n`);\n },\n warn(message: string): void {\n process.stderr.write(`${pc.yellow(`WARN: ${message}`)}\\n`);\n },\n error(message: string): void {\n process.stderr.write(`${pc.red(`ERROR: ${message}`)}\\n`);\n },\n};\n","import { explainErrorWithAI } from \"./services/ai.js\";\nimport type { ExplainContext, ExplainedError } from \"./types/error.js\";\n\nexport async function explainError(\n errorMessage: string,\n context: ExplainContext = {},\n): Promise<ExplainedError> {\n return explainErrorWithAI(errorMessage, context);\n}\n","import { z } from \"zod\";\nimport { explainErrorWithAI } from \"../services/ai.js\";\nimport type { ExplainedError } from \"../types/error.js\";\n\nconst explainErrorSkillInputSchema = z.object({\n error: z.string().min(1, \"error is required\"),\n stack_trace: z.string().optional(),\n code_snippet: z.string().optional(),\n runtime: z.string().optional(),\n framework: z.string().optional(),\n});\n\nexport type ExplainErrorSkillInput = z.infer<typeof explainErrorSkillInputSchema>;\n\nexport async function runExplainErrorSkill(input: ExplainErrorSkillInput): Promise<ExplainedError> {\n const parsedInput = explainErrorSkillInputSchema.parse(input);\n return explainErrorWithAI(parsedInput.error, {\n stackTrace: parsedInput.stack_trace,\n codeSnippet: parsedInput.code_snippet,\n runtime: parsedInput.runtime,\n framework: parsedInput.framework,\n });\n}\n"],"mappings":"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","names":["pc","pc","explainError","require","pc","z","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "explain-my-error",
3
- "version": "1.0.10",
3
+ "version": "1.0.11",
4
4
  "description": "AI-powered CLI to explain programming errors with fixes and ELI5 output.",
5
5
  "type": "module",
6
6
  "bin": {