@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.
- package/README.md +436 -0
- package/dist/cli/index.js +101 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/ai.js +195 -0
- package/dist/core/ai.js.map +1 -0
- package/dist/core/args.js +221 -0
- package/dist/core/args.js.map +1 -0
- package/dist/core/codebase-context.js +74 -0
- package/dist/core/codebase-context.js.map +1 -0
- package/dist/core/command-intelligence.js +196 -0
- package/dist/core/command-intelligence.js.map +1 -0
- package/dist/core/env.js +117 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/error-parser.js +172 -0
- package/dist/core/error-parser.js.map +1 -0
- package/dist/core/process.js +118 -0
- package/dist/core/process.js.map +1 -0
- package/dist/core/prompts.js +64 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/provider-health.js +71 -0
- package/dist/core/provider-health.js.map +1 -0
- package/dist/core/runner.js +266 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/setup.js +82 -0
- package/dist/core/setup.js.map +1 -0
- package/dist/core/simulation.js +330 -0
- package/dist/core/simulation.js.map +1 -0
- package/dist/core/skills.js +57 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/utils/logger.js +147 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +43 -0
package/dist/core/ai.js
ADDED
|
@@ -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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"}
|