explain-my-error 1.0.11 → 1.0.12

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
@@ -349,7 +349,7 @@ Return STRICT JSON only (no markdown) with fields:
349
349
 
350
350
  Use provided runtime/framework/code/stack context to produce context-aware likely root cause and framework-specific fixes.`;
351
351
  const contextBlock = [
352
- `Error message:
352
+ `User input:
353
353
  ${errorMessage}`,
354
354
  `Runtime:
355
355
  ${context.runtime ?? "unknown"}`,
@@ -358,7 +358,9 @@ ${context.framework ?? "unknown"}`,
358
358
  `Stack trace:
359
359
  ${context.stackTrace ?? "not provided"}`,
360
360
  `Code snippet:
361
- ${context.codeSnippet ?? "not provided"}`
361
+ ${context.codeSnippet ?? "not provided"}`,
362
+ `Conversation history:
363
+ ${context.conversationHistory && context.conversationHistory.length > 0 ? context.conversationHistory.map((item) => `${item.role.toUpperCase()}: ${item.content}`).join("\n") : "not provided"}`
362
364
  ].join("\n\n");
363
365
  const requestBody = {
364
366
  messages: [
@@ -539,7 +541,7 @@ async function runExplainCommand(errorMessage, optionsOrDeps = { output: "pretty
539
541
  const log = deps.log ?? logger;
540
542
  if (!errorMessage?.trim()) {
541
543
  log.warn("Please provide an error message.");
542
- return;
544
+ return null;
543
545
  }
544
546
  const spinner = createSpinner("Analyzing your error...");
545
547
  try {
@@ -551,10 +553,12 @@ async function runExplainCommand(errorMessage, optionsOrDeps = { output: "pretty
551
553
  } else {
552
554
  log.info(formatOutput(result));
553
555
  }
556
+ return result;
554
557
  } catch (error) {
555
558
  spinner.fail("Could not explain this error.");
556
559
  const message = error instanceof Error ? error.message : "Unknown error";
557
560
  log.error(message);
561
+ return null;
558
562
  }
559
563
  }
560
564
 
@@ -641,6 +645,23 @@ async function promptForError() {
641
645
  rl.close();
642
646
  }
643
647
  }
648
+ async function promptForFollowUp() {
649
+ if (!process.stdin.isTTY) {
650
+ return "";
651
+ }
652
+ const rl = createInterface({
653
+ input: process.stdin,
654
+ output: process.stdout
655
+ });
656
+ try {
657
+ const answer = await rl.question(
658
+ pc3.bold(pc3.cyan("\n> Follow-up question (press Enter to finish): "))
659
+ );
660
+ return answer.trim();
661
+ } finally {
662
+ rl.close();
663
+ }
664
+ }
644
665
  async function upsertEnvVar(filePath, key, value) {
645
666
  let existing = "";
646
667
  try {
@@ -705,9 +726,34 @@ async function runCli(argv = process.argv, deps = {}) {
705
726
  const runExplain = deps.runExplain ?? runExplainCommand;
706
727
  const readStdinFn = deps.readStdin ?? readStdin;
707
728
  const promptForErrorFn = deps.promptForError ?? promptForError;
729
+ const promptForFollowUpFn = deps.promptForFollowUp ?? (deps.runExplain ? async () => "" : promptForFollowUp);
708
730
  const stdinIsTTY = deps.stdinIsTTY ?? (() => Boolean(process.stdin.isTTY));
709
731
  const ensureApiKeyFn = deps.ensureApiKey ?? (deps.runExplain ? async () => true : ensureGroqApiKey);
710
732
  const log = deps.log ?? logger;
733
+ async function runInteractiveConversation(baseOptions, initialPrompt) {
734
+ const history = [];
735
+ let currentPrompt = initialPrompt ?? await promptForErrorFn();
736
+ while (currentPrompt) {
737
+ const result = await runExplain(currentPrompt, {
738
+ ...baseOptions,
739
+ context: {
740
+ ...baseOptions.context,
741
+ conversationHistory: history
742
+ }
743
+ });
744
+ if (result && typeof result === "object") {
745
+ const title = "title" in result && typeof result.title === "string" ? result.title : "Analysis";
746
+ const rootCause = "likely_root_cause" in result && typeof result.likely_root_cause === "string" ? result.likely_root_cause : "No root cause provided.";
747
+ history.push({ role: "user", content: currentPrompt });
748
+ history.push({ role: "assistant", content: `${title}. Root cause: ${rootCause}` });
749
+ }
750
+ const followUp = await promptForFollowUpFn();
751
+ if (!followUp) {
752
+ return;
753
+ }
754
+ currentPrompt = followUp;
755
+ }
756
+ }
711
757
  const program = new Command();
712
758
  program.name("explain-my-error").description("Explain programming errors with AI").version(getCliVersion()).addHelpText(
713
759
  "after",
@@ -762,20 +808,39 @@ Examples:
762
808
  ).action(async (errorParts, options) => {
763
809
  const inlineError = errorParts.join(" ").trim();
764
810
  const pipedError = inlineError ? "" : await readStdinFn();
811
+ let apiKeyAlreadyValidated = false;
812
+ if (!inlineError && !pipedError && stdinIsTTY()) {
813
+ const hasApiKey = await ensureApiKeyFn();
814
+ apiKeyAlreadyValidated = hasApiKey;
815
+ if (!hasApiKey) {
816
+ log.warn("GROQ_API_KEY is required. Set it and run again.");
817
+ return;
818
+ }
819
+ }
765
820
  const promptedError = !inlineError && !pipedError ? await promptForErrorFn() : "";
766
821
  const finalError = inlineError || pipedError || promptedError;
767
822
  const explainOptions = await buildExplainOptions(options);
768
- const hasApiKey = await ensureApiKeyFn();
769
- if (!hasApiKey) {
770
- log.warn("GROQ_API_KEY is required. Set it and run again.");
823
+ if (!apiKeyAlreadyValidated) {
824
+ const hasApiKey = await ensureApiKeyFn();
825
+ if (!hasApiKey) {
826
+ log.warn("GROQ_API_KEY is required. Set it and run again.");
827
+ return;
828
+ }
829
+ }
830
+ if (!inlineError && !pipedError && stdinIsTTY()) {
831
+ await runInteractiveConversation(explainOptions, promptedError);
771
832
  return;
772
833
  }
773
834
  await runExplain(finalError, explainOptions);
774
835
  });
775
836
  program.action(async () => {
776
837
  if (stdinIsTTY()) {
777
- const promptedError = await promptForErrorFn();
778
- await runExplain(promptedError, await buildExplainOptions({}));
838
+ const hasApiKey2 = await ensureApiKeyFn();
839
+ if (!hasApiKey2) {
840
+ log.warn("GROQ_API_KEY is required. Set it and run again.");
841
+ return;
842
+ }
843
+ await runInteractiveConversation(await buildExplainOptions({}));
779
844
  return;
780
845
  }
781
846
  const pipedError = await readStdinFn();
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\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":";;;AACA,OAAO;;;ACDP,SAAS,QAAQ,UAAU,iBAAiB;AAC5C,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,eAAe;AACxB,OAAOA,SAAQ;;;ACJf,OAAO,SAAS;;;ACAhB,OAAO,WAAW;;;ACAlB,SAAS,SAAS;AAEX,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC5B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;AACvB,CAAC;AAEM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,MAAM,EAAE,KAAK,CAAC,cAAc,cAAc,eAAe,CAAC;AAAA,EAC1D,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EACvC,WAAW,EAAE,OAAO;AAAA,IAClB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACtB,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACnC,CAAC;AACH,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EACvC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAChC,CAAC;AAEM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EAC1C,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAEM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EAC/C,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACrB,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACnC,YAAY,EAAE,MAAM,gBAAgB,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAClD,WAAW,EAAE,MAAM,aAAa,EAAE,IAAI,CAAC;AAAA,EACvC,mBAAmB,EAAE,MAAM,qBAAqB,EAAE,IAAI,CAAC;AAAA,EACvD,oBAAoB,EAAE,MAAM,sBAAsB,EAAE,IAAI,CAAC;AAAA,EACzD,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AACpD,CAAC;;;AD1CD,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB,QAAQ,IAAI,uBAAuB;AAM/D,SAAS,YAAY,SAA0B;AAC7C,QAAM,UAAU,QAAQ,KAAK;AAE7B,QAAM,WAAW,CAAC,UAAkC;AAClD,QAAI;AACF,aAAO,KAAK,MAAM,KAAK;AAAA,IACzB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gCAAgC,CAAC,UAA0B;AAC/D,QAAI,SAAS;AACb,QAAI,WAAW;AACf,QAAI,WAAW;AAEf,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,YAAM,KAAK,MAAM,CAAC;AAElB,UAAI,CAAC,UAAU;AACb,kBAAU;AACV,YAAI,OAAO,KAAK;AACd,qBAAW;AAAA,QACb;AACA;AAAA,MACF;AAEA,UAAI,UAAU;AACZ,kBAAU;AACV,mBAAW;AACX;AAAA,MACF;AAEA,UAAI,OAAO,MAAM;AACf,kBAAU;AACV,mBAAW;AACX;AAAA,MACF;AAEA,UAAI,OAAO,KAAK;AACd,kBAAU;AACV,mBAAW;AACX;AAAA,MACF;AAEA,UAAI,OAAO,MAAM;AACf,kBAAU;AACV;AAAA,MACF;AACA,UAAI,OAAO,MAAM;AACf,kBAAU;AACV;AAAA,MACF;AACA,UAAI,OAAO,KAAM;AACf,kBAAU;AACV;AAAA,MACF;AAEA,YAAM,OAAO,GAAG,WAAW,CAAC;AAC5B,UAAI,OAAO,IAAM;AACf,kBAAU,MAAM,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAClD;AAAA,MACF;AAEA,gBAAU;AAAA,IACZ;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,MAAM,aAAa;AACzC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAEA,QAAM,YAAY,MAAM,CAAC;AACzB,QAAM,kBAAkB,SAAS,SAAS;AAC1C,MAAI,oBAAoB,MAAM;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,8BAA8B,SAAS;AACzD,QAAM,kBAAkB,SAAS,SAAS;AAC1C,MAAI,oBAAoB,MAAM;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,+BAA+B;AACjD;AAEA,SAAS,eAAe,OAAwB;AAC9C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI;AACF,aAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,IACtC,QAAQ;AACN,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,EACF;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,cAAc,OAA0B;AAC/C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MACJ,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC,EAClC,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAAA,EACnB;AACA,SAAO,eAAe,KAAK,EACxB,MAAM,MAAM,EACZ,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACnB;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACvC;AACA,QAAM,SAAS,OAAO,eAAe,KAAK,CAAC;AAC3C,MAAI,CAAC,OAAO,MAAM,MAAM,GAAG;AACzB,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,SAA2B;AACzD,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,OAAO;AAEb,QAAM,eAAe,cAAc,KAAK,aAAa;AAErD,QAAM,gBAAgB,MAAM,QAAQ,KAAK,UAAU,IAAI,KAAK,aAAa,CAAC;AAC1E,QAAM,aAAa,cAChB,IAAI,CAAC,SAAS;AACb,UAAM,MAAM;AACZ,WAAO;AAAA,MACL,YAAY,eAAe,KAAK,UAAU;AAAA,MAC1C,YAAY,aAAa,KAAK,UAAU;AAAA,MACxC,KAAK,eAAe,KAAK,GAAG;AAAA,IAC9B;AAAA,EACF,CAAC,EACA,OAAO,CAAC,SAAS,KAAK,cAAc,KAAK,GAAG,EAC5C,MAAM,GAAG,CAAC;AAEb,QAAM,cAAc,MAAM,QAAQ,KAAK,SAAS,IAAI,KAAK,YAAY,CAAC;AACtE,QAAM,qBAAqB,YACxB,IAAI,CAAC,MAAM,UAAU;AACpB,UAAM,MAAM;AACZ,UAAM,cAAc,UAAU,IAAI,eAAe,UAAU,IAAI,eAAe;AAC9E,UAAM,WAAW,eAAe,KAAK,QAAQ,WAAW,EAAE,YAAY;AACtE,UAAM,OACJ,aAAa,gBAAgB,aAAa,gBAAgB,aAAa,kBACnE,WACA;AAEN,UAAM,YAAa,KAAK,aAAa,CAAC;AACtC,WAAO;AAAA,MACL;AAAA,MACA,SAAS,eAAe,KAAK,OAAO;AAAA,MACpC,OAAO,cAAc,KAAK,KAAK;AAAA,MAC/B,WAAW;AAAA,QACT,MAAM,eAAe,UAAU,QAAQ,SAAS;AAAA,QAChD,aAAa,eAAe,UAAU,eAAe,SAAS;AAAA,QAC9D,iBAAiB,eAAe,UAAU,mBAAmB,SAAS;AAAA,MACxE;AAAA,IACF;AAAA,EACF,CAAC,EACA,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK,MAAM,SAAS,CAAC;AAEzD,QAAM,WACJ,mBAAmB,UAAU,IACzB,mBAAmB,MAAM,GAAG,CAAC,IAC7B;AAAA,IACE;AAAA,MACE,MAAM;AAAA,MACN,SAAS,eAAe,KAAK,GAAG;AAAA,MAChC,OAAO,CAAC,eAAe,KAAK,GAAG,KAAK,kDAAkD;AAAA,MACtF,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,QACb,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,QACb,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,QACb,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEN,QAAM,sBAAsB,MAAM,QAAQ,KAAK,iBAAiB,IAAI,KAAK,oBAAoB,CAAC;AAC9F,QAAM,mBAAmB,oBACtB,IAAI,CAAC,SAAS;AACb,UAAM,MAAM;AACZ,WAAO;AAAA,MACL,WAAW,eAAe,KAAK,SAAS;AAAA,MACxC,aAAa,eAAe,KAAK,WAAW;AAAA,MAC5C,OAAO,cAAc,KAAK,KAAK;AAAA,MAC/B,cAAc,eAAe,KAAK,YAAY;AAAA,IAChD;AAAA,EACF,CAAC,EACA;AAAA,IACC,CAAC,SAAS,KAAK,aAAa,KAAK,eAAe,KAAK,MAAM,SAAS,KAAK,KAAK;AAAA,EAChF;AAEF,QAAM,uBAAuB,MAAM,QAAQ,KAAK,kBAAkB,IAC9D,KAAK,qBACL,CAAC;AACL,QAAM,oBAAoB,qBACvB,IAAI,CAAC,SAAS;AACb,UAAM,MAAM;AACZ,WAAO;AAAA,MACL,OAAO,eAAe,KAAK,KAAK;AAAA,MAChC,UAAU,cAAc,KAAK,QAAQ;AAAA,MACrC,SAAS,eAAe,KAAK,OAAO,KAAK;AAAA,IAC3C;AAAA,EACF,CAAC,EACA,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,SAAS,SAAS,CAAC;AAE1D,QAAM,kBAAkB,cAAc,KAAK,gBAAgB;AAE3D,QAAM,QAAQ,eAAe,KAAK,KAAK;AACvC,QAAM,cAAc,eAAe,KAAK,WAAW;AACnD,QAAM,cAAc,eAAe,KAAK,YAAY;AACpD,QAAM,MAAM,eAAe,KAAK,GAAG;AACnC,QAAM,kBACJ,eAAe,KAAK,iBAAiB,KACrC,aAAa,CAAC,KACd;AAEF,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB,aAAa,eAAe;AAAA,IAC5B,eACE,aAAa,SAAS,IAAI,eAAe,CAAC,8CAA8C;AAAA,IAC1F,KAAK,OAAO;AAAA,IACZ,cAAc,eAAe;AAAA,IAC7B,MAAM,eAAe,KAAK,IAAI,KAAK;AAAA,IACnC,mBAAmB;AAAA,IACnB,YACE,WAAW,SAAS,IAChB,aACA;AAAA,MACE;AAAA,QACE,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,KAAK;AAAA,MACP;AAAA,IACF;AAAA,IACN,WAAW;AAAA,IACX,mBACE,iBAAiB,SAAS,IACtB,mBACA;AAAA,MACE;AAAA,QACE,WAAW;AAAA,QACX,aAAa;AAAA,QACb,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IACN,oBACE,kBAAkB,SAAS,IACvB,oBACA;AAAA,MACE;AAAA,QACE,OAAO;AAAA,QACP,UAAU,CAAC,gBAAgB,cAAc;AAAA,MAC3C;AAAA,IACF;AAAA,IACN,kBACE,gBAAgB,SAAS,IACrB,kBACA,CAAC,2BAA2B,yCAAyC;AAAA,EAC7E;AACF;AAEA,eAAsB,mBACpB,cACA,UAA0B,CAAC,GACF;AACzB,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AAEA,QAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBf,QAAM,eAAe;AAAA,IACnB;AAAA,EAAmB,YAAY;AAAA,IAC/B;AAAA,EAAa,QAAQ,WAAW,SAAS;AAAA,IACzC;AAAA,EAAe,QAAQ,aAAa,SAAS;AAAA,IAC7C;AAAA,EAAiB,QAAQ,cAAc,cAAc;AAAA,IACrD;AAAA,EAAkB,QAAQ,eAAe,cAAc;AAAA,EACzD,EAAE,KAAK,MAAM;AAEb,QAAM,cAAc;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,MAAM,UAAmB,SAAS,OAAO;AAAA,MAC3C;AAAA,QACE,MAAM;AAAA,QACN,SAAS,GAAG,YAAY;AAAA;AAAA;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,aAAa;AAAA,EACf;AAEA,QAAM,gBAAgB;AAAA,IACpB,SAAS;AAAA,MACP,eAAe,UAAU,MAAM;AAAA,MAC/B,gBAAgB;AAAA,IAClB;AAAA,IACA,SAAS;AAAA,EACX;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM;AAAA,MACrB;AAAA,MACA,EAAE,OAAO,oBAAoB,GAAG,YAAY;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,MAAM,aAAa,KAAK,GAAG;AAC7B,YAAM,kBACJ,OAAO,MAAM,UAAU,MAAM,OAAO,YAAY,WAC5C,MAAM,SAAS,KAAK,MAAM,UAC1B,MAAM;AAEZ,YAAM,wBACJ,gBAAgB,YAAY,EAAE,SAAS,gBAAgB,KACvD,gBAAgB,YAAY,EAAE,SAAS,qBAAqB;AAE9D,UAAI,uBAAuB;AACzB,mBAAW,MAAM,MAAM;AAAA,UACrB;AAAA,UACA,EAAE,OAAO,qBAAqB,GAAG,YAAY;AAAA,UAC7C;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,IAAI,MAAM,4BAA4B,eAAe,EAAE;AAAA,MAC/D;AAAA,IACF,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,MAAM,UAAU,CAAC,GAAG,SAAS;AACtD,MAAI,OAAO,YAAY,YAAY,CAAC,QAAQ,KAAK,GAAG;AAClD,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,QAAM,SAAS,YAAY,OAAO;AAClC,QAAM,aAAa,uBAAuB,MAAM;AAChD,SAAO,qBAAqB,MAAM,UAAU;AAC9C;;;AEvbA,OAAO,QAAQ;AAGf,IAAM,aAAa;AAEnB,SAAS,KAAK,OAAO,KAAa;AAChC,SAAO,KAAK,OAAO,UAAU;AAC/B;AAEA,SAAS,IAAI,MAAsB;AACjC,SAAO,KAAK,SAAS,aAAa,IAAI,GAAG,KAAK,MAAM,GAAG,aAAa,CAAC,CAAC,QAAQ;AAChF;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,KAAK,IAAI,IAAI,EAAE,OAAO,aAAa,CAAC,CAAC;AAC9C;AAEA,SAAS,MAAM,OAAe,MAAsB;AAClD,QAAM,OAAO,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC;AACxD,SAAO,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,GAAG,KAAK,GAAG,KAAK,KAAK,CAAC,GAAG,GAAG,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AACvF;AAEA,SAAS,KAAK,OAAyB;AACrC,SAAO,MAAM,IAAI,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI;AACtE;AAEO,SAAS,qBAAqB,QAAgC;AACnE,QAAM,eAAe,KAAK,OAAO,aAAa;AAC9C,QAAM,aAAa,OAAO,WACvB;AAAA,IACC,CAAC,MAAM,UACL,GAAG,QAAQ,CAAC,KAAK,KAAK,UAAU;AAAA,kBAAqB,KAAK,aAAa,KAAK,QAAQ,CAAC,CAAC;AAAA,UAAc,KAAK,GAAG;AAAA,EAChH,EACC,KAAK,MAAM;AACd,QAAM,WAAW,OAAO,UACrB,IAAI,CAAC,SAAS;AACb,UAAM,QACJ,KAAK,SAAS,eACV,eACA,KAAK,SAAS,eACZ,eACA;AACR,WAAO;AAAA,MACL,GAAG,GAAG,KAAK,GAAG,MAAM,KAAK,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,MAC5C,GAAG,KAAK,MAAM,IAAI,CAAC,MAAM,UAAU,KAAK,QAAQ,CAAC,KAAK,IAAI,EAAE;AAAA,MAC5D,wBAAwB,KAAK,UAAU,IAAI,kBAAkB,KAAK,UAAU,WAAW,sBAAsB,KAAK,UAAU,eAAe;AAAA,IAC7I,EAAE,KAAK,IAAI;AAAA,EACb,CAAC,EACA,KAAK,MAAM;AACd,QAAM,mBAAmB,OAAO,kBAC7B;AAAA,IAAI,CAAC,WACJ;AAAA,MACE,GAAG,GAAG,KAAK,GAAG,KAAK,OAAO,SAAS,CAAC,CAAC,KAAK,OAAO,WAAW;AAAA,MAC5D,GAAG,OAAO,MAAM,IAAI,CAAC,MAAM,UAAU,KAAK,QAAQ,CAAC,KAAK,IAAI,EAAE;AAAA,MAC9D;AAAA,MACA,OAAO,aACJ,MAAM,IAAI,EACV,IAAI,CAAC,aAAa,OAAO,QAAQ,EAAE,EACnC,KAAK,IAAI;AAAA,IACd,EAAE,KAAK,IAAI;AAAA,EACb,EACC,KAAK,MAAM;AACd,QAAM,oBAAoB,OAAO,mBAC9B,IAAI,CAAC,cAAc;AAClB,UAAM,UAAU,UAAU,SAAS,KAAK,IACpC;AAAA;AAAA,EAAiB,UAAU,QACxB,MAAM,IAAI,EACV,IAAI,CAAC,aAAa,OAAO,QAAQ,EAAE,EACnC,KAAK,IAAI,CAAC,KACb;AACJ,WACE;AAAA,MACE,GAAG,GAAG,KAAK,GAAG,MAAM,UAAU,KAAK,CAAC,CAAC;AAAA,MACrC,GAAG,UAAU,SAAS,IAAI,CAAC,YAAY,OAAO,OAAO,EAAE;AAAA,IACzD,EAAE,KAAK,IAAI,IAAI;AAAA,EAEnB,CAAC,EACA,KAAK,MAAM;AACd,QAAM,kBAAkB,KAAK,OAAO,gBAAgB;AACpD,QAAM,OAAO;AAAA,IACX,GAAG,KAAK,KAAK,GAAG,CAAC;AAAA,IACjB,WAAW,GAAG,KAAK,GAAG,KAAK,kBAAkB,CAAC,CAAC;AAAA,IAC/C,WAAW,GAAG,IAAI,iCAAiC,CAAC;AAAA,IACpD,GAAG,KAAK,KAAK,GAAG,CAAC;AAAA,EACnB,EAAE,KAAK,IAAI;AAEX,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAG,GAAG,KAAK,GAAG,KAAK,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,GAAG,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IAChE,GAAG,GAAG,KAAK,GAAG,OAAO,mBAAmB,CAAC,CAAC,KAAK,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAAA,IACjF;AAAA,IACA,MAAM,eAAe,OAAO,WAAW;AAAA,IACvC;AAAA,IACA,MAAM,iBAAiB,YAAY;AAAA,IACnC;AAAA,IACA,MAAM,gCAAgC,UAAU;AAAA,IAChD;AAAA,IACA,MAAM,oBAAoB,QAAQ;AAAA,IAClC;AAAA,IACA,GAAG,GAAG,KAAK,GAAG,MAAM,KAAK,CAAC,CAAC;AAAA,EAAK,GAAG,MAAM,OAAO,GAAG,CAAC;AAAA,IACpD;AAAA,IACA,MAAM,gBAAgB,OAAO,YAAY;AAAA,IACzC;AAAA,IACA,MAAM,8BAA8B,gBAAgB;AAAA,IACpD;AAAA,IACA,MAAM,0BAA0B,iBAAiB;AAAA,IACjD;AAAA,IACA,MAAM,oBAAoB,eAAe;AAAA,IACzC;AAAA,IACA,MAAM,QAAQ,OAAO,IAAI;AAAA,IACzB;AAAA,IACA,GAAG,IAAI,kDAAkD;AAAA,EAC3D,EAAE,KAAK,IAAI;AACb;;;AClHA,OAAOC,SAAQ;AAER,IAAM,SAAS;AAAA,EACpB,KAAK,SAAuB;AAC1B,YAAQ,OAAO,MAAM,GAAGA,IAAG,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,EAC/C;AAAA,EACA,QAAQ,SAAuB;AAC7B,YAAQ,OAAO,MAAM,GAAGA,IAAG,MAAM,OAAO,OAAO,EAAE,CAAC;AAAA,CAAI;AAAA,EACxD;AAAA,EACA,KAAK,SAAuB;AAC1B,YAAQ,OAAO,MAAM,GAAGA,IAAG,OAAO,SAAS,OAAO,EAAE,CAAC;AAAA,CAAI;AAAA,EAC3D;AAAA,EACA,MAAM,SAAuB;AAC3B,YAAQ,OAAO,MAAM,GAAGA,IAAG,IAAI,UAAU,OAAO,EAAE,CAAC;AAAA,CAAI;AAAA,EACzD;AACF;;;AJcA,SAAS,aAAa,OAAyC;AAC7D,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,YAAY;AAClB,SACE,kBAAkB,aAClB,mBAAmB,aACnB,kBAAkB,aAClB,SAAS;AAEb;AAEA,eAAsB,kBACpB,cACA,gBAAwD,EAAE,QAAQ,SAAS,GAC3E,UAA0B,CAAC,GACZ;AACf,QAAM,UAAU,aAAa,aAAa,IAAI,EAAE,QAAQ,SAAkB,IAAI;AAC9E,QAAM,OAAO,aAAa,aAAa,IAAI,gBAAgB;AAE3D,QAAM,eAAe,KAAK,gBAAgB;AAC1C,QAAM,gBAAgB,KAAK,kBAAkB,CAAC,SAAiB,IAAI,IAAI,EAAE,MAAM;AAC/E,QAAM,eAAe,KAAK,gBAAgB;AAC1C,QAAM,MAAM,KAAK,OAAO;AAExB,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,QAAI,KAAK,kCAAkC;AAC3C;AAAA,EACF;AAEA,QAAM,UAAU,cAAc,yBAAyB;AAEvD,MAAI;AACF,UAAM,SAAS,MAAM,aAAa,aAAa,KAAK,GAAG,QAAQ,OAAO;AACtE,YAAQ,QAAQ,oBAAoB;AACpC,QAAI,KAAK,EAAE;AACX,QAAI,QAAQ,WAAW,QAAQ;AAC7B,UAAI,KAAK,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC1C,OAAO;AACL,UAAI,KAAK,aAAa,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,KAAK,+BAA+B;AAC5C,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,QAAI,MAAM,OAAO;AAAA,EACnB;AACF;;;ADnEA,IAAMC,WAAU,cAAc,YAAY,GAAG;AAE7C,SAAS,gBAAwB;AAC/B,MAAI;AACF,UAAM,MAAMA,SAAQ,iBAAiB;AACrC,WAAO,IAAI,WAAW;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,YAA6B;AAC1C,MAAI,QAAQ,MAAM,OAAO;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,SAAmB,CAAC;AAC1B,mBAAiB,SAAS,QAAQ,OAAO;AACvC,WAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,EACjE;AACA,SAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,KAAK;AACrD;AAEA,eAAe,aAAa,UAA2D;AACrF,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,MAAM,SAAS,UAAU,MAAM;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,iCAA8D;AAC3E,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,gBAAgB,MAAM;AACjD,UAAM,MAAM,KAAK,MAAM,GAAG;AAI1B,UAAM,OAAO,EAAE,GAAI,IAAI,gBAAgB,CAAC,GAAI,GAAI,IAAI,mBAAmB,CAAC,EAAG;AAC3E,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,WAAW,KAAM,QAAO;AAC5B,QAAI,aAAa,KAAM,QAAO;AAC9B,QAAI,gBAAgB,KAAM,QAAO;AACjC,QAAI,aAAa,KAAM,QAAO;AAC9B,QAAI,YAAY,QAAQ,kBAAkB,KAAM,QAAO;AAAA,EACzD,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAYA,eAAe,oBAAoB,SAA4D;AAC7F,QAAM,gBAAgB,MAAM,aAAa,QAAQ,SAAS;AAC1D,QAAM,eAAe,MAAM,aAAa,QAAQ,QAAQ;AACxD,QAAM,oBAAoB,MAAM,+BAA+B;AAE/D,QAAM,UAA0B;AAAA,IAC9B,YAAY,QAAQ,SAAS;AAAA,IAC7B,aAAa,QAAQ,QAAQ;AAAA,IAC7B,SAAS,QAAQ,WAAW,QAAQ,QAAQ,OAAO;AAAA,IACnD,WAAW,QAAQ,aAAa,qBAAqB;AAAA,EACvD;AAEA,SAAO;AAAA,IACL,QAAQ,QAAQ,OAAO,SAAS;AAAA,IAChC;AAAA,EACF;AACF;AAEA,eAAe,iBAAkC;AAC/C,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,gBAAgB;AAAA,IACzB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI;AACF,WAAO,KAAKC,IAAG,KAAK,yCAAyC,CAAC;AAC9D,WAAO,KAAKA,IAAG,IAAI,6DAA6D,CAAC;AACjF,WAAO,MAAM;AACX,YAAM,SAAS,MAAM,GAAG,SAASA,IAAG,KAAKA,IAAG,KAAK,qBAAqB,CAAC,CAAC;AACxE,YAAM,UAAU,OAAO,KAAK;AAE5B,UAAI,SAAS;AACX,eAAO;AAAA,MACT;AAEA,aAAO,KAAK,kDAAkD;AAAA,IAChE;AAAA,EACF,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEA,eAAe,aAAa,UAAkB,KAAa,OAA8B;AACvF,MAAI,WAAW;AACf,MAAI;AACF,UAAM,OAAO,QAAQ;AACrB,eAAW,MAAM,SAAS,UAAU,MAAM;AAAA,EAC5C,QAAQ;AACN,eAAW;AAAA,EACb;AAEA,QAAM,UAAU,GAAG,GAAG,IAAI,KAAK;AAC/B,QAAM,aAAa,IAAI,OAAO,IAAI,GAAG,QAAQ,GAAG;AAChD,MAAI;AAEJ,MAAI,WAAW,KAAK,QAAQ,GAAG;AAC7B,kBAAc,SAAS,QAAQ,YAAY,OAAO;AAAA,EACpD,WAAW,CAAC,SAAS,KAAK,GAAG;AAC3B,kBAAc,GAAG,OAAO;AAAA;AAAA,EAC1B,OAAO;AACL,UAAM,uBAAuB,CAAC,SAAS,SAAS,IAAI;AACpD,kBAAc,GAAG,QAAQ,GAAG,uBAAuB,OAAO,EAAE,GAAG,OAAO;AAAA;AAAA,EACxE;AAEA,QAAM,UAAU,UAAU,aAAa,MAAM;AAC/C;AAEA,eAAe,mBAAqC;AAClD,MAAI,QAAQ,IAAI,cAAc,KAAK,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,gBAAgB;AAAA,IACzB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI;AACF,WAAO,KAAK,0BAA0B;AACtC,WAAO,KAAKA,IAAG,KAAK,sCAAsC,CAAC;AAE3D,WAAO,MAAM;AACX,YAAM,OAAO,MAAM,GAAG,SAASA,IAAG,KAAKA,IAAG,KAAK,oBAAoB,CAAC,CAAC,GAAG,KAAK;AAC7E,UAAI,CAAC,KAAK;AACR,eAAO,KAAK,4CAA4C;AACxD;AAAA,MACF;AAEA,cAAQ,IAAI,eAAe;AAE3B,YAAM,cACJ,MAAM,GAAG,SAASA,IAAG,IAAI,qDAAqD,CAAC,GAE9E,KAAK,EACL,YAAY;AACf,YAAM,aAAa,eAAe,MAAM,eAAe,OAAO,eAAe;AAE7E,UAAI,YAAY;AACd,YAAI;AACF,gBAAM,aAAa,QAAQ,gBAAgB,GAAG;AAC9C,iBAAO,QAAQ,4BAA4B;AAAA,QAC7C,QAAQ;AACN,iBAAO,KAAK,6DAA6D;AAAA,QAC3E;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAeA,eAAsB,OAAO,OAAiB,QAAQ,MAAM,OAAmB,CAAC,GAAkB;AAChG,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,cAAc,KAAK,aAAa;AACtC,QAAM,mBAAmB,KAAK,kBAAkB;AAChD,QAAM,aAAa,KAAK,eAAe,MAAM,QAAQ,QAAQ,MAAM,KAAK;AACxE,QAAM,iBACJ,KAAK,iBAAiB,KAAK,aAAa,YAAY,OAAO;AAC7D,QAAM,MAAM,KAAK,OAAO;AAExB,QAAM,UAAU,IAAI,QAAQ;AAE5B,UACG,KAAK,kBAAkB,EACvB,YAAY,oCAAoC,EAChD,QAAQ,cAAc,CAAC,EACvB;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBF;AAEF,UACG,QAAQ,SAAS,EACjB,YAAY,qCAAqC,EACjD,SAAS,cAAc,0BAA0B,EACjD,OAAO,UAAU,wBAAwB,EACzC,OAAO,wBAAwB,gCAAgC,EAC/D,OAAO,uBAAuB,8BAA8B,EAC5D,OAAO,wBAAwB,iCAAiC,EAChE,OAAO,sBAAsB,+BAA+B,EAC5D,OAAO,uBAAuB,6CAA6C,EAC3E,OAAO,2BAA2B,qDAAqD,EACvF;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BF,EACC,OAAO,OAAO,YAAsB,YAA+B;AAClE,UAAM,cAAc,WAAW,KAAK,GAAG,EAAE,KAAK;AAC9C,UAAM,aAAa,cAAc,KAAK,MAAM,YAAY;AACxD,UAAM,gBAAgB,CAAC,eAAe,CAAC,aAAa,MAAM,iBAAiB,IAAI;AAC/E,UAAM,aAAa,eAAe,cAAc;AAChD,UAAM,iBAAiB,MAAM,oBAAoB,OAAO;AACxD,UAAM,YAAY,MAAM,eAAe;AACvC,QAAI,CAAC,WAAW;AACd,UAAI,KAAK,iDAAiD;AAC1D;AAAA,IACF;AACA,UAAM,WAAW,YAAY,cAAc;AAAA,EAC7C,CAAC;AAEH,UAAQ,OAAO,YAAY;AACzB,QAAI,WAAW,GAAG;AAChB,YAAM,gBAAgB,MAAM,iBAAiB;AAC7C,YAAM,WAAW,eAAe,MAAM,oBAAoB,CAAC,CAAC,CAAC;AAC7D;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,YAAY;AACrC,QAAI,CAAC,YAAY;AACf,UAAI,KAAK,oEAAoE;AAC7E;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,eAAe;AACvC,QAAI,CAAC,WAAW;AACd,UAAI,KAAK,iDAAiD;AAC1D;AAAA,IACF;AAEA,UAAM,WAAW,YAAY,MAAM,oBAAoB,CAAC,CAAC,CAAC;AAAA,EAC5D,CAAC;AAED,QAAM,QAAQ,WAAW,IAAI;AAC/B;;;AD9TA,OAAO,EAAE,MAAM,CAAC,UAAmB;AACjC,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,UAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AACnC,UAAQ,KAAK,CAAC;AAChB,CAAC;","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 promptForFollowUp(): 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 const answer = await rl.question(\n pc.bold(pc.cyan(\"\\n> Follow-up question (press Enter to finish): \")),\n );\n return answer.trim();\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?: (\n errorMessage: string,\n options?: ExplainCommandOptions,\n ) => Promise<{ title: string; likely_root_cause: string } | null | undefined>;\n readStdin?: () => Promise<string>;\n promptForError?: () => Promise<string>;\n promptForFollowUp?: () => 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 promptForFollowUpFn =\n deps.promptForFollowUp ?? (deps.runExplain ? async () => \"\" : promptForFollowUp);\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 async function runInteractiveConversation(\n baseOptions: ExplainCommandOptions,\n initialPrompt?: string,\n ): Promise<void> {\n const history: Array<{ role: \"user\" | \"assistant\"; content: string }> = [];\n\n let currentPrompt = initialPrompt ?? (await promptForErrorFn());\n while (currentPrompt) {\n const result = await runExplain(currentPrompt, {\n ...baseOptions,\n context: {\n ...baseOptions.context,\n conversationHistory: history,\n },\n });\n\n if (result && typeof result === \"object\") {\n const title =\n \"title\" in result && typeof result.title === \"string\" ? result.title : \"Analysis\";\n const rootCause =\n \"likely_root_cause\" in result && typeof result.likely_root_cause === \"string\"\n ? result.likely_root_cause\n : \"No root cause provided.\";\n history.push({ role: \"user\", content: currentPrompt });\n history.push({ role: \"assistant\", content: `${title}. Root cause: ${rootCause}` });\n }\n\n const followUp = await promptForFollowUpFn();\n if (!followUp) {\n return;\n }\n currentPrompt = followUp;\n }\n }\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 let apiKeyAlreadyValidated = false;\n if (!inlineError && !pipedError && stdinIsTTY()) {\n const hasApiKey = await ensureApiKeyFn();\n apiKeyAlreadyValidated = hasApiKey;\n if (!hasApiKey) {\n log.warn(\"GROQ_API_KEY is required. Set it and run again.\");\n return;\n }\n }\n\n const promptedError = !inlineError && !pipedError ? await promptForErrorFn() : \"\";\n const finalError = inlineError || pipedError || promptedError;\n const explainOptions = await buildExplainOptions(options);\n if (!apiKeyAlreadyValidated) {\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\n if (!inlineError && !pipedError && stdinIsTTY()) {\n await runInteractiveConversation(explainOptions, promptedError);\n return;\n }\n\n await runExplain(finalError, explainOptions);\n });\n\n program.action(async () => {\n if (stdinIsTTY()) {\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 runInteractiveConversation(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<ExplainedError | null> {\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 null;\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 return result;\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 return null;\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 `User input:\\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 `Conversation history:\\n${\n context.conversationHistory && context.conversationHistory.length > 0\n ? context.conversationHistory\n .map((item) => `${item.role.toUpperCase()}: ${item.content}`)\n .join(\"\\n\")\n : \"not provided\"\n }`,\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 conversationHistory?: Array<{\n role: \"user\" | \"assistant\";\n content: string;\n }>;\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","hasApiKey"]}
package/dist/index.d.ts CHANGED
@@ -164,6 +164,10 @@ type ExplainContext = {
164
164
  codeSnippet?: string;
165
165
  runtime?: string;
166
166
  framework?: string;
167
+ conversationHistory?: Array<{
168
+ role: "user" | "assistant";
169
+ content: string;
170
+ }>;
167
171
  };
168
172
 
169
173
  type ExplainCommandOptions = {
@@ -175,9 +179,13 @@ type CliLogger = {
175
179
  warn(message: string): void;
176
180
  };
177
181
  type RunCliDeps = {
178
- runExplain?: (errorMessage: string, options?: ExplainCommandOptions) => Promise<void>;
182
+ runExplain?: (errorMessage: string, options?: ExplainCommandOptions) => Promise<{
183
+ title: string;
184
+ likely_root_cause: string;
185
+ } | null | undefined>;
179
186
  readStdin?: () => Promise<string>;
180
187
  promptForError?: () => Promise<string>;
188
+ promptForFollowUp?: () => Promise<string>;
181
189
  stdinIsTTY?: () => boolean;
182
190
  ensureApiKey?: () => Promise<boolean>;
183
191
  log?: CliLogger;
package/dist/index.js CHANGED
@@ -344,7 +344,7 @@ Return STRICT JSON only (no markdown) with fields:
344
344
 
345
345
  Use provided runtime/framework/code/stack context to produce context-aware likely root cause and framework-specific fixes.`;
346
346
  const contextBlock = [
347
- `Error message:
347
+ `User input:
348
348
  ${errorMessage}`,
349
349
  `Runtime:
350
350
  ${context.runtime ?? "unknown"}`,
@@ -353,7 +353,9 @@ ${context.framework ?? "unknown"}`,
353
353
  `Stack trace:
354
354
  ${context.stackTrace ?? "not provided"}`,
355
355
  `Code snippet:
356
- ${context.codeSnippet ?? "not provided"}`
356
+ ${context.codeSnippet ?? "not provided"}`,
357
+ `Conversation history:
358
+ ${context.conversationHistory && context.conversationHistory.length > 0 ? context.conversationHistory.map((item) => `${item.role.toUpperCase()}: ${item.content}`).join("\n") : "not provided"}`
357
359
  ].join("\n\n");
358
360
  const requestBody = {
359
361
  messages: [
@@ -534,7 +536,7 @@ async function runExplainCommand(errorMessage, optionsOrDeps = { output: "pretty
534
536
  const log = deps.log ?? logger;
535
537
  if (!errorMessage?.trim()) {
536
538
  log.warn("Please provide an error message.");
537
- return;
539
+ return null;
538
540
  }
539
541
  const spinner = createSpinner("Analyzing your error...");
540
542
  try {
@@ -546,10 +548,12 @@ async function runExplainCommand(errorMessage, optionsOrDeps = { output: "pretty
546
548
  } else {
547
549
  log.info(formatOutput(result));
548
550
  }
551
+ return result;
549
552
  } catch (error) {
550
553
  spinner.fail("Could not explain this error.");
551
554
  const message = error instanceof Error ? error.message : "Unknown error";
552
555
  log.error(message);
556
+ return null;
553
557
  }
554
558
  }
555
559
 
@@ -636,6 +640,23 @@ async function promptForError() {
636
640
  rl.close();
637
641
  }
638
642
  }
643
+ async function promptForFollowUp() {
644
+ if (!process.stdin.isTTY) {
645
+ return "";
646
+ }
647
+ const rl = createInterface({
648
+ input: process.stdin,
649
+ output: process.stdout
650
+ });
651
+ try {
652
+ const answer = await rl.question(
653
+ pc3.bold(pc3.cyan("\n> Follow-up question (press Enter to finish): "))
654
+ );
655
+ return answer.trim();
656
+ } finally {
657
+ rl.close();
658
+ }
659
+ }
639
660
  async function upsertEnvVar(filePath, key, value) {
640
661
  let existing = "";
641
662
  try {
@@ -700,9 +721,34 @@ async function runCli(argv = process.argv, deps = {}) {
700
721
  const runExplain = deps.runExplain ?? runExplainCommand;
701
722
  const readStdinFn = deps.readStdin ?? readStdin;
702
723
  const promptForErrorFn = deps.promptForError ?? promptForError;
724
+ const promptForFollowUpFn = deps.promptForFollowUp ?? (deps.runExplain ? async () => "" : promptForFollowUp);
703
725
  const stdinIsTTY = deps.stdinIsTTY ?? (() => Boolean(process.stdin.isTTY));
704
726
  const ensureApiKeyFn = deps.ensureApiKey ?? (deps.runExplain ? async () => true : ensureGroqApiKey);
705
727
  const log = deps.log ?? logger;
728
+ async function runInteractiveConversation(baseOptions, initialPrompt) {
729
+ const history = [];
730
+ let currentPrompt = initialPrompt ?? await promptForErrorFn();
731
+ while (currentPrompt) {
732
+ const result = await runExplain(currentPrompt, {
733
+ ...baseOptions,
734
+ context: {
735
+ ...baseOptions.context,
736
+ conversationHistory: history
737
+ }
738
+ });
739
+ if (result && typeof result === "object") {
740
+ const title = "title" in result && typeof result.title === "string" ? result.title : "Analysis";
741
+ const rootCause = "likely_root_cause" in result && typeof result.likely_root_cause === "string" ? result.likely_root_cause : "No root cause provided.";
742
+ history.push({ role: "user", content: currentPrompt });
743
+ history.push({ role: "assistant", content: `${title}. Root cause: ${rootCause}` });
744
+ }
745
+ const followUp = await promptForFollowUpFn();
746
+ if (!followUp) {
747
+ return;
748
+ }
749
+ currentPrompt = followUp;
750
+ }
751
+ }
706
752
  const program = new Command();
707
753
  program.name("explain-my-error").description("Explain programming errors with AI").version(getCliVersion()).addHelpText(
708
754
  "after",
@@ -757,20 +803,39 @@ Examples:
757
803
  ).action(async (errorParts, options) => {
758
804
  const inlineError = errorParts.join(" ").trim();
759
805
  const pipedError = inlineError ? "" : await readStdinFn();
806
+ let apiKeyAlreadyValidated = false;
807
+ if (!inlineError && !pipedError && stdinIsTTY()) {
808
+ const hasApiKey = await ensureApiKeyFn();
809
+ apiKeyAlreadyValidated = hasApiKey;
810
+ if (!hasApiKey) {
811
+ log.warn("GROQ_API_KEY is required. Set it and run again.");
812
+ return;
813
+ }
814
+ }
760
815
  const promptedError = !inlineError && !pipedError ? await promptForErrorFn() : "";
761
816
  const finalError = inlineError || pipedError || promptedError;
762
817
  const explainOptions = await buildExplainOptions(options);
763
- const hasApiKey = await ensureApiKeyFn();
764
- if (!hasApiKey) {
765
- log.warn("GROQ_API_KEY is required. Set it and run again.");
818
+ if (!apiKeyAlreadyValidated) {
819
+ const hasApiKey = await ensureApiKeyFn();
820
+ if (!hasApiKey) {
821
+ log.warn("GROQ_API_KEY is required. Set it and run again.");
822
+ return;
823
+ }
824
+ }
825
+ if (!inlineError && !pipedError && stdinIsTTY()) {
826
+ await runInteractiveConversation(explainOptions, promptedError);
766
827
  return;
767
828
  }
768
829
  await runExplain(finalError, explainOptions);
769
830
  });
770
831
  program.action(async () => {
771
832
  if (stdinIsTTY()) {
772
- const promptedError = await promptForErrorFn();
773
- await runExplain(promptedError, await buildExplainOptions({}));
833
+ const hasApiKey2 = await ensureApiKeyFn();
834
+ if (!hasApiKey2) {
835
+ log.warn("GROQ_API_KEY is required. Set it and run again.");
836
+ return;
837
+ }
838
+ await runInteractiveConversation(await buildExplainOptions({}));
774
839
  return;
775
840
  }
776
841
  const pipedError = await readStdinFn();
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\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"]}
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 promptForFollowUp(): 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 const answer = await rl.question(\n pc.bold(pc.cyan(\"\\n> Follow-up question (press Enter to finish): \")),\n );\n return answer.trim();\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?: (\n errorMessage: string,\n options?: ExplainCommandOptions,\n ) => Promise<{ title: string; likely_root_cause: string } | null | undefined>;\n readStdin?: () => Promise<string>;\n promptForError?: () => Promise<string>;\n promptForFollowUp?: () => 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 promptForFollowUpFn =\n deps.promptForFollowUp ?? (deps.runExplain ? async () => \"\" : promptForFollowUp);\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 async function runInteractiveConversation(\n baseOptions: ExplainCommandOptions,\n initialPrompt?: string,\n ): Promise<void> {\n const history: Array<{ role: \"user\" | \"assistant\"; content: string }> = [];\n\n let currentPrompt = initialPrompt ?? (await promptForErrorFn());\n while (currentPrompt) {\n const result = await runExplain(currentPrompt, {\n ...baseOptions,\n context: {\n ...baseOptions.context,\n conversationHistory: history,\n },\n });\n\n if (result && typeof result === \"object\") {\n const title =\n \"title\" in result && typeof result.title === \"string\" ? result.title : \"Analysis\";\n const rootCause =\n \"likely_root_cause\" in result && typeof result.likely_root_cause === \"string\"\n ? result.likely_root_cause\n : \"No root cause provided.\";\n history.push({ role: \"user\", content: currentPrompt });\n history.push({ role: \"assistant\", content: `${title}. Root cause: ${rootCause}` });\n }\n\n const followUp = await promptForFollowUpFn();\n if (!followUp) {\n return;\n }\n currentPrompt = followUp;\n }\n }\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 let apiKeyAlreadyValidated = false;\n if (!inlineError && !pipedError && stdinIsTTY()) {\n const hasApiKey = await ensureApiKeyFn();\n apiKeyAlreadyValidated = hasApiKey;\n if (!hasApiKey) {\n log.warn(\"GROQ_API_KEY is required. Set it and run again.\");\n return;\n }\n }\n\n const promptedError = !inlineError && !pipedError ? await promptForErrorFn() : \"\";\n const finalError = inlineError || pipedError || promptedError;\n const explainOptions = await buildExplainOptions(options);\n if (!apiKeyAlreadyValidated) {\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\n if (!inlineError && !pipedError && stdinIsTTY()) {\n await runInteractiveConversation(explainOptions, promptedError);\n return;\n }\n\n await runExplain(finalError, explainOptions);\n });\n\n program.action(async () => {\n if (stdinIsTTY()) {\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 runInteractiveConversation(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<ExplainedError | null> {\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 null;\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 return result;\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 return null;\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 `User input:\\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 `Conversation history:\\n${\n context.conversationHistory && context.conversationHistory.length > 0\n ? context.conversationHistory\n .map((item) => `${item.role.toUpperCase()}: ${item.content}`)\n .join(\"\\n\")\n : \"not provided\"\n }`,\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 conversationHistory?: Array<{\n role: \"user\" | \"assistant\";\n content: string;\n }>;\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","hasApiKey","z","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "explain-my-error",
3
- "version": "1.0.11",
3
+ "version": "1.0.12",
4
4
  "description": "AI-powered CLI to explain programming errors with fixes and ELI5 output.",
5
5
  "type": "module",
6
6
  "bin": {