@0xprathamesh/why-cli 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AIExplanationError = void 0;
4
+ exports.hasAIConfiguration = hasAIConfiguration;
5
+ exports.explainFailureWithAI = explainFailureWithAI;
6
+ exports.explainSimulationWithAI = explainSimulationWithAI;
7
+ const prompts_1 = require("@langchain/core/prompts");
8
+ const ollama_1 = require("@langchain/ollama");
9
+ const openai_1 = require("@langchain/openai");
10
+ const env_1 = require("./env");
11
+ const prompts_2 = require("./prompts");
12
+ class AIExplanationError extends Error {
13
+ constructor(message) {
14
+ super(message);
15
+ this.name = "AIExplanationError";
16
+ }
17
+ }
18
+ exports.AIExplanationError = AIExplanationError;
19
+ function resolveOpenAIKey(options) {
20
+ if (options.apiKey) {
21
+ return options.apiKey;
22
+ }
23
+ if (options.apiKeyEnv) {
24
+ return process.env[options.apiKeyEnv];
25
+ }
26
+ return (0, env_1.resolveEnvAlias)(["OPENAI_API_KEY", "OPENAI_APIKEY", "OPENAIAPIKEY", "openaiapikey"]);
27
+ }
28
+ function hasAIConfiguration(options) {
29
+ if (options.provider === "none") {
30
+ return false;
31
+ }
32
+ if (options.provider === "ollama") {
33
+ return true;
34
+ }
35
+ return Boolean(resolveOpenAIKey(options));
36
+ }
37
+ function normalizeContent(content) {
38
+ if (typeof content === "string") {
39
+ return content;
40
+ }
41
+ if (Array.isArray(content)) {
42
+ return content
43
+ .map((part) => {
44
+ if (typeof part === "string") {
45
+ return part;
46
+ }
47
+ if (part && typeof part === "object" && "text" in part) {
48
+ return String(part.text ?? "");
49
+ }
50
+ return "";
51
+ })
52
+ .join("\n")
53
+ .trim();
54
+ }
55
+ return String(content ?? "");
56
+ }
57
+ function extractJsonObject(raw) {
58
+ const fenced = raw.match(/```(?:json)?\s*([\s\S]+?)```/i);
59
+ if (fenced?.[1]) {
60
+ raw = fenced[1].trim();
61
+ }
62
+ const firstBrace = raw.indexOf("{");
63
+ const lastBrace = raw.lastIndexOf("}");
64
+ if (firstBrace === -1 || lastBrace === -1 || lastBrace <= firstBrace) {
65
+ throw new AIExplanationError("The AI response did not contain a JSON object.");
66
+ }
67
+ return raw.slice(firstBrace, lastBrace + 1);
68
+ }
69
+ function parseAIExplanation(raw, provider, model) {
70
+ let json;
71
+ try {
72
+ json = JSON.parse(extractJsonObject(raw));
73
+ }
74
+ catch (error) {
75
+ throw new AIExplanationError(`Could not parse AI response as JSON: ${error.message}`);
76
+ }
77
+ return {
78
+ provider,
79
+ model,
80
+ headline: typeof json.headline === "string" ? json.headline : "AI analysis",
81
+ summary: typeof json.summary === "string" ? json.summary : raw.trim(),
82
+ mostLikelyCause: typeof json.mostLikelyCause === "string" ? json.mostLikelyCause : "The model did not provide a distinct root cause.",
83
+ nextSteps: Array.isArray(json.nextSteps) ? json.nextSteps.map(String).filter(Boolean) : [],
84
+ guardrails: Array.isArray(json.guardrails) ? json.guardrails.map(String).filter(Boolean) : [],
85
+ confidence: json.confidence === "low" || json.confidence === "medium" || json.confidence === "high" ? json.confidence : "medium",
86
+ raw,
87
+ };
88
+ }
89
+ function buildModel(options) {
90
+ if (options.provider === "none") {
91
+ return null;
92
+ }
93
+ const openAIKey = resolveOpenAIKey(options);
94
+ if (options.provider === "openai" || (options.provider === "auto" && openAIKey)) {
95
+ if (!openAIKey) {
96
+ return null;
97
+ }
98
+ const modelName = options.model ?? (0, env_1.resolveEnvAlias)(["OPENAI_MODEL", "openaimodel"]) ?? "gpt-4.1";
99
+ return {
100
+ provider: "openai",
101
+ modelName,
102
+ model: new openai_1.ChatOpenAI({
103
+ model: modelName,
104
+ apiKey: openAIKey,
105
+ temperature: 0,
106
+ configuration: options.openaiBaseUrl
107
+ ? {
108
+ baseURL: options.openaiBaseUrl,
109
+ }
110
+ : undefined,
111
+ }),
112
+ };
113
+ }
114
+ const modelName = options.model ?? (0, env_1.resolveEnvAlias)(["OLLAMA_MODEL", "ollamamodel"]) ?? "llama3.1";
115
+ return {
116
+ provider: "ollama",
117
+ modelName,
118
+ model: new ollama_1.ChatOllama({
119
+ model: modelName,
120
+ baseUrl: options.ollamaHost ??
121
+ (0, env_1.resolveEnvAlias)(["OLLAMA_HOST", "OLLAMA_URL", "ollamaurl", "ollamahost"]) ??
122
+ "http://127.0.0.1:11434",
123
+ temperature: 0,
124
+ format: "json",
125
+ }),
126
+ };
127
+ }
128
+ async function invokePrompt(model, promptText) {
129
+ const prompt = prompts_1.ChatPromptTemplate.fromMessages([
130
+ ["system", "You are a precise AI assistant for developers. Follow the requested JSON schema exactly."],
131
+ ["human", "{input}"],
132
+ ]);
133
+ const messages = await prompt.formatMessages({ input: promptText });
134
+ const response = await model.invoke(messages);
135
+ return normalizeContent(response.content);
136
+ }
137
+ function wrapPlainTextAsExplanation(raw, provider, model) {
138
+ return {
139
+ provider,
140
+ model,
141
+ headline: "AI Analysis",
142
+ summary: raw.trim() || "The model returned an empty response.",
143
+ mostLikelyCause: "",
144
+ nextSteps: [],
145
+ guardrails: [],
146
+ confidence: "medium",
147
+ raw,
148
+ };
149
+ }
150
+ async function explainFailureWithAI(input) {
151
+ const resolution = buildModel(input.options);
152
+ if (!resolution) {
153
+ return null;
154
+ }
155
+ const raw = await invokePrompt(resolution.model, (0, prompts_2.buildFailureAnalysisPrompt)({
156
+ command: input.command,
157
+ intent: input.intent,
158
+ parsedError: input.parsedError,
159
+ stdout: input.stdout,
160
+ stderr: input.stderr,
161
+ skills: input.skills,
162
+ codeContext: input.codeContext,
163
+ }));
164
+ try {
165
+ return parseAIExplanation(raw, resolution.provider, resolution.modelName);
166
+ }
167
+ catch (error) {
168
+ if (error instanceof AIExplanationError) {
169
+ return wrapPlainTextAsExplanation(raw, resolution.provider, resolution.modelName);
170
+ }
171
+ throw error;
172
+ }
173
+ }
174
+ async function explainSimulationWithAI(input) {
175
+ const resolution = buildModel(input.options);
176
+ if (!resolution) {
177
+ return null;
178
+ }
179
+ const raw = await invokePrompt(resolution.model, (0, prompts_2.buildSimulationPrompt)({
180
+ command: input.command,
181
+ intent: input.intent,
182
+ simulation: input.simulation,
183
+ skills: input.skills,
184
+ }));
185
+ try {
186
+ return parseAIExplanation(raw, resolution.provider, resolution.modelName);
187
+ }
188
+ catch (error) {
189
+ if (error instanceof AIExplanationError) {
190
+ return wrapPlainTextAsExplanation(raw, resolution.provider, resolution.modelName);
191
+ }
192
+ throw error;
193
+ }
194
+ }
195
+ //# sourceMappingURL=ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/core/ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseArgs = parseArgs;
4
+ exports.renderHelp = renderHelp;
5
+ const DEFAULTS = {
6
+ commandArgs: [],
7
+ silent: false,
8
+ json: false,
9
+ color: true,
10
+ raw: false,
11
+ explain: false,
12
+ provider: "auto",
13
+ model: undefined,
14
+ cwd: undefined,
15
+ timeoutMs: undefined,
16
+ apiKey: undefined,
17
+ apiKeyEnv: undefined,
18
+ ollamaHost: undefined,
19
+ openaiBaseUrl: undefined,
20
+ skills: [],
21
+ listSkills: false,
22
+ help: false,
23
+ version: false,
24
+ mode: "auto",
25
+ doctor: false,
26
+ setup: false,
27
+ stream: undefined,
28
+ };
29
+ function takeValue(args, index, flag) {
30
+ const value = args[index + 1];
31
+ if (!value || value.startsWith("-")) {
32
+ throw new Error(`Missing value for ${flag}`);
33
+ }
34
+ return value;
35
+ }
36
+ function parseMode(value) {
37
+ if (value === "auto" || value === "run" || value === "simulate") {
38
+ return value;
39
+ }
40
+ throw new Error(`Unsupported mode: ${value}`);
41
+ }
42
+ function parseArgs(argv) {
43
+ const options = {
44
+ ...DEFAULTS,
45
+ command: "",
46
+ };
47
+ const commandParts = [];
48
+ let commandMode = false;
49
+ for (let index = 0; index < argv.length; index += 1) {
50
+ const arg = argv[index];
51
+ if (arg === "--") {
52
+ commandParts.push(...argv.slice(index + 1));
53
+ break;
54
+ }
55
+ if (commandMode) {
56
+ commandParts.push(arg);
57
+ continue;
58
+ }
59
+ if (!arg.startsWith("-")) {
60
+ commandParts.push(arg);
61
+ commandMode = true;
62
+ continue;
63
+ }
64
+ switch (arg) {
65
+ case "-h":
66
+ case "--help":
67
+ options.help = true;
68
+ break;
69
+ case "-v":
70
+ case "--version":
71
+ options.version = true;
72
+ break;
73
+ case "-s":
74
+ case "--silent":
75
+ options.silent = true;
76
+ break;
77
+ case "--json":
78
+ options.json = true;
79
+ break;
80
+ case "--no-color":
81
+ options.color = false;
82
+ break;
83
+ case "-r":
84
+ case "--raw":
85
+ options.raw = true;
86
+ break;
87
+ case "-e":
88
+ case "--explain":
89
+ options.explain = true;
90
+ break;
91
+ case "--list-skills":
92
+ options.listSkills = true;
93
+ break;
94
+ case "--doctor":
95
+ options.doctor = true;
96
+ break;
97
+ case "--setup":
98
+ options.setup = true;
99
+ break;
100
+ case "--stream":
101
+ options.stream = true;
102
+ break;
103
+ case "--no-stream":
104
+ options.stream = false;
105
+ break;
106
+ case "--provider":
107
+ options.provider = takeValue(argv, index, arg);
108
+ index += 1;
109
+ break;
110
+ case "--model":
111
+ options.model = takeValue(argv, index, arg);
112
+ index += 1;
113
+ break;
114
+ case "--cwd":
115
+ options.cwd = takeValue(argv, index, arg);
116
+ index += 1;
117
+ break;
118
+ case "--timeout":
119
+ options.timeoutMs = Number(takeValue(argv, index, arg));
120
+ index += 1;
121
+ break;
122
+ case "--api-key":
123
+ options.apiKey = takeValue(argv, index, arg);
124
+ index += 1;
125
+ break;
126
+ case "--api-key-env":
127
+ options.apiKeyEnv = takeValue(argv, index, arg);
128
+ index += 1;
129
+ break;
130
+ case "--ollama-host":
131
+ options.ollamaHost = takeValue(argv, index, arg);
132
+ index += 1;
133
+ break;
134
+ case "--openai-base-url":
135
+ options.openaiBaseUrl = takeValue(argv, index, arg);
136
+ index += 1;
137
+ break;
138
+ case "--skill":
139
+ options.skills.push(takeValue(argv, index, arg));
140
+ index += 1;
141
+ break;
142
+ case "--mode":
143
+ options.mode = parseMode(takeValue(argv, index, arg));
144
+ index += 1;
145
+ break;
146
+ case "--simulate":
147
+ options.mode = "simulate";
148
+ break;
149
+ case "--run":
150
+ case "--execute":
151
+ options.mode = "run";
152
+ break;
153
+ default:
154
+ throw new Error(`Unknown flag: ${arg}`);
155
+ }
156
+ }
157
+ if (options.timeoutMs !== undefined && Number.isNaN(options.timeoutMs)) {
158
+ throw new Error("`--timeout` must be a number in milliseconds");
159
+ }
160
+ options.commandArgs = [...commandParts];
161
+ options.command = commandParts
162
+ .map((part) => (/\s/.test(part) ? JSON.stringify(part) : part))
163
+ .join(" ")
164
+ .trim();
165
+ return options;
166
+ }
167
+ function renderHelp(version) {
168
+ return `
169
+ why-cli v${version}
170
+
171
+ AI-first command debugger with LangChain-backed analysis, dry-run simulation,
172
+ and safer defaults for risky commands like git push or npm publish.
173
+
174
+ Usage:
175
+ why [options] -- <command>
176
+ why [options] <command>
177
+
178
+ Modes:
179
+ auto Run read-only commands, simulate risky mutating commands
180
+ run Execute the command for real
181
+ simulate Run a safe preflight instead of the real command when supported
182
+
183
+ Flags:
184
+ -h, --help Show help
185
+ -v, --version Show version
186
+ -s, --silent Hide formatted output
187
+ --json Emit structured JSON
188
+ --no-color Disable ANSI colors
189
+ -r, --raw Stream raw stdout/stderr for executed commands
190
+ -e, --explain Force AI narration when a model is available
191
+ --mode <name> auto | run | simulate
192
+ --simulate Alias for --mode simulate
193
+ --run, --execute Alias for --mode run
194
+ --provider <name> auto | none | openai | ollama
195
+ --model <name> Override the model name for the selected provider
196
+ --cwd <path> Run the command in a specific directory
197
+ --timeout <ms> Kill the command if it runs too long
198
+ --skill <name> Add AI behavior hints like debug, teach, fix, tests
199
+ --list-skills Print the built-in skill catalog
200
+ --doctor Validate .env/provider configuration and connectivity
201
+ --setup Configure global why-cli defaults in ~/.config/why-cli/.env
202
+ --stream Force live streaming of stdout/stderr while the command runs
203
+ --no-stream Disable live streaming and wait for process exit before printing output
204
+ --api-key <key> Pass an API key directly
205
+ --api-key-env <name> Read the API key from a custom env var
206
+ --openai-base-url <url> Override the OpenAI-compatible base URL
207
+ --ollama-host <url> Override the Ollama host
208
+
209
+ Examples:
210
+ why --doctor
211
+ why --setup
212
+ why --stream -- npm start
213
+ why -- npm test
214
+ why --simulate -- git push origin main
215
+ why --simulate -- git add .
216
+ why --run -- git commit -m "ship it"
217
+ why --provider openai --skill debug --skill fix -- npm run build
218
+ why --provider ollama --model llama3.1 --simulate -- npm publish
219
+ `.trim();
220
+ }
221
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/core/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.collectCodeContext = collectCodeContext;
7
+ exports.formatCodeContext = formatCodeContext;
8
+ const fs_1 = require("fs");
9
+ const path_1 = __importDefault(require("path"));
10
+ function unique(values) {
11
+ return [...new Set(values)];
12
+ }
13
+ function readSnippet(filePath, lineNumber) {
14
+ if (!(0, fs_1.existsSync)(filePath)) {
15
+ return null;
16
+ }
17
+ const content = (0, fs_1.readFileSync)(filePath, "utf8");
18
+ const lines = content.split(/\r?\n/);
19
+ const start = Math.max((lineNumber ?? 1) - 3, 1);
20
+ const end = Math.min((lineNumber ?? 1) + 3, lines.length);
21
+ const excerpt = lines
22
+ .slice(start - 1, end)
23
+ .map((line, index) => `${start + index}: ${line}`)
24
+ .join("\n");
25
+ return excerpt;
26
+ }
27
+ function extractTypedErrorLocations(output) {
28
+ const matches = [...output.matchAll(/([A-Za-z0-9_./-]+\.(?:ts|tsx|js|jsx|json|mjs|cjs))\((\d+),\d+\)/g)];
29
+ return matches.map((match) => ({
30
+ filePath: match[1],
31
+ lineNumber: Number(match[2]),
32
+ }));
33
+ }
34
+ function collectCodeContext(cwd, output) {
35
+ const snippets = [];
36
+ const typedLocations = extractTypedErrorLocations(output);
37
+ for (const location of typedLocations.slice(0, 3)) {
38
+ const absolutePath = path_1.default.isAbsolute(location.filePath) ? location.filePath : path_1.default.join(cwd, location.filePath);
39
+ const excerpt = readSnippet(absolutePath, location.lineNumber);
40
+ if (excerpt) {
41
+ snippets.push({
42
+ filePath: absolutePath,
43
+ reason: `Referenced by the error output around line ${location.lineNumber ?? "unknown"}.`,
44
+ excerpt,
45
+ });
46
+ }
47
+ }
48
+ for (const projectFile of ["package.json", "tsconfig.json"].map((name) => path_1.default.join(cwd, name))) {
49
+ if (snippets.length >= 5) {
50
+ break;
51
+ }
52
+ if (!(0, fs_1.existsSync)(projectFile)) {
53
+ continue;
54
+ }
55
+ const excerpt = readSnippet(projectFile, 1);
56
+ if (excerpt) {
57
+ snippets.push({
58
+ filePath: projectFile,
59
+ reason: "Project configuration context.",
60
+ excerpt,
61
+ });
62
+ }
63
+ }
64
+ return unique(snippets.map((snippet) => JSON.stringify(snippet))).map((snippet) => JSON.parse(snippet));
65
+ }
66
+ function formatCodeContext(snippets) {
67
+ if (snippets.length === 0) {
68
+ return "No local code context was collected.";
69
+ }
70
+ return snippets
71
+ .map((snippet) => `File: ${snippet.filePath}\nReason: ${snippet.reason}\nSnippet:\n${snippet.excerpt}`)
72
+ .join("\n\n");
73
+ }
74
+ //# sourceMappingURL=codebase-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codebase-context.js","sourceRoot":"","sources":["../../src/core/codebase-context.ts"],"names":[],"mappings":"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"}