@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
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildSkillPrompt = buildSkillPrompt;
|
|
4
|
+
exports.buildFailureAnalysisPrompt = buildFailureAnalysisPrompt;
|
|
5
|
+
exports.buildSimulationPrompt = buildSimulationPrompt;
|
|
6
|
+
const codebase_context_1 = require("./codebase-context");
|
|
7
|
+
function buildSkillPrompt(skills) {
|
|
8
|
+
return skills.map((skill) => `- ${skill.promptHint}`).join("\n");
|
|
9
|
+
}
|
|
10
|
+
function buildFailureAnalysisPrompt(input) {
|
|
11
|
+
return [
|
|
12
|
+
"You are an expert debugging copilot for terminal commands.",
|
|
13
|
+
"Return strict JSON with these keys only:",
|
|
14
|
+
'{"headline":"string","summary":"string","mostLikelyCause":"string","nextSteps":["string"],"guardrails":["string"],"confidence":"low|medium|high"}',
|
|
15
|
+
"Keep the advice concrete and based on the evidence.",
|
|
16
|
+
"Treat the raw command output as the primary source of truth.",
|
|
17
|
+
"Use the parser signals only as hints, not as authoritative labels.",
|
|
18
|
+
"Prefer simple, direct language with no fluff.",
|
|
19
|
+
"Do not wrap the JSON in markdown fences.",
|
|
20
|
+
"Skill guidance:",
|
|
21
|
+
buildSkillPrompt(input.skills) || "- Focus on practical debugging steps.",
|
|
22
|
+
"",
|
|
23
|
+
`Command: ${input.command}`,
|
|
24
|
+
`Family: ${input.intent.family}`,
|
|
25
|
+
`Action: ${input.intent.action}`,
|
|
26
|
+
`Risk: ${input.intent.risk}`,
|
|
27
|
+
`Rule-based headline: ${input.parsedError.headline}`,
|
|
28
|
+
`Rule-based summary: ${input.parsedError.summary}`,
|
|
29
|
+
`Evidence: ${input.parsedError.evidence.join(" | ") || "None"}`,
|
|
30
|
+
`Signals: ${input.parsedError.signals.join(" | ") || "None"}`,
|
|
31
|
+
`File references: ${input.parsedError.fileReferences.join(" | ") || "None"}`,
|
|
32
|
+
`Stack frames: ${input.parsedError.stackFrames.join(" | ") || "None"}`,
|
|
33
|
+
"",
|
|
34
|
+
"Relevant codebase context:",
|
|
35
|
+
(0, codebase_context_1.formatCodeContext)(input.codeContext).slice(0, 12000),
|
|
36
|
+
"",
|
|
37
|
+
"Captured output:",
|
|
38
|
+
`${input.stderr}\n${input.stdout}`.trim().slice(0, 10000) || "<empty>",
|
|
39
|
+
].join("\n");
|
|
40
|
+
}
|
|
41
|
+
function buildSimulationPrompt(input) {
|
|
42
|
+
return [
|
|
43
|
+
"You are an expert release and debugging copilot.",
|
|
44
|
+
"Return strict JSON with these keys only:",
|
|
45
|
+
'{"headline":"string","summary":"string","mostLikelyCause":"string","nextSteps":["string"],"guardrails":["string"],"confidence":"low|medium|high"}',
|
|
46
|
+
"Explain what would happen if the command were executed for real, based on the simulation signals.",
|
|
47
|
+
"Prefer simple, direct language with no fluff.",
|
|
48
|
+
"Do not wrap the JSON in markdown fences.",
|
|
49
|
+
"Skill guidance:",
|
|
50
|
+
buildSkillPrompt(input.skills) || "- Focus on practical preflight guidance.",
|
|
51
|
+
"",
|
|
52
|
+
`Command: ${input.command}`,
|
|
53
|
+
`Family: ${input.intent.family}`,
|
|
54
|
+
`Action: ${input.intent.action}`,
|
|
55
|
+
`Risk: ${input.intent.risk}`,
|
|
56
|
+
`Simulation verdict: ${input.simulation.verdict}`,
|
|
57
|
+
`Simulation summary: ${input.simulation.summary}`,
|
|
58
|
+
`Simulation checks: ${input.simulation.checks.join(" | ") || "None"}`,
|
|
59
|
+
"",
|
|
60
|
+
"Simulation artifacts:",
|
|
61
|
+
input.simulation.artifacts.map((artifact) => `${artifact.title}: ${artifact.body}`).join("\n").slice(0, 10000) || "<empty>",
|
|
62
|
+
].join("\n");
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/core/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkOpenAIHealth = checkOpenAIHealth;
|
|
4
|
+
exports.checkOllamaHealth = checkOllamaHealth;
|
|
5
|
+
const env_1 = require("./env");
|
|
6
|
+
function createAbortSignal(timeoutMs) {
|
|
7
|
+
return AbortSignal.timeout(timeoutMs);
|
|
8
|
+
}
|
|
9
|
+
async function checkOpenAIHealth(options) {
|
|
10
|
+
const apiKey = options.apiKey ||
|
|
11
|
+
(options.apiKeyEnv ? process.env[options.apiKeyEnv] : undefined) ||
|
|
12
|
+
(0, env_1.resolveEnvAlias)(["OPENAI_API_KEY", "OPENAI_APIKEY", "OPENAIAPIKEY", "openaiapikey"]);
|
|
13
|
+
if (!apiKey) {
|
|
14
|
+
return {
|
|
15
|
+
provider: "openai",
|
|
16
|
+
configured: false,
|
|
17
|
+
reachable: false,
|
|
18
|
+
message: "No OpenAI API key was found in flags or .env.",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const baseUrl = options.openaiBaseUrl || (0, env_1.resolveEnvAlias)(["OPENAI_BASE_URL", "OPENAI_BASEURL", "openaibaseurl"]) || "https://api.openai.com/v1";
|
|
22
|
+
try {
|
|
23
|
+
const response = await fetch(`${baseUrl}/models`, {
|
|
24
|
+
headers: {
|
|
25
|
+
Authorization: `Bearer ${apiKey}`,
|
|
26
|
+
},
|
|
27
|
+
signal: createAbortSignal(4000),
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
provider: "openai",
|
|
31
|
+
configured: true,
|
|
32
|
+
reachable: response.ok,
|
|
33
|
+
message: response.ok
|
|
34
|
+
? "OpenAI credentials and endpoint look reachable."
|
|
35
|
+
: `OpenAI endpoint responded with status ${response.status}.`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
return {
|
|
40
|
+
provider: "openai",
|
|
41
|
+
configured: true,
|
|
42
|
+
reachable: false,
|
|
43
|
+
message: `OpenAI health check failed: ${error.message}`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function checkOllamaHealth(options) {
|
|
48
|
+
const host = options.ollamaHost || (0, env_1.resolveEnvAlias)(["OLLAMA_HOST", "OLLAMA_URL", "ollamaurl", "ollamahost"]) || "http://127.0.0.1:11434";
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetch(`${host}/api/tags`, {
|
|
51
|
+
signal: createAbortSignal(4000),
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
provider: "ollama",
|
|
55
|
+
configured: true,
|
|
56
|
+
reachable: response.ok,
|
|
57
|
+
message: response.ok
|
|
58
|
+
? "Ollama is reachable."
|
|
59
|
+
: `Ollama endpoint responded with status ${response.status}.`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return {
|
|
64
|
+
provider: "ollama",
|
|
65
|
+
configured: true,
|
|
66
|
+
reachable: false,
|
|
67
|
+
message: `Ollama health check failed: ${error.message}`,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=provider-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-health.js","sourceRoot":"","sources":["../../src/core/provider-health.ts"],"names":[],"mappings":";;AAcA,8CAyCC;AAED,8CAwBC;AAhFD,+BAAwC;AASxC,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,OAAO,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,OAAmB;IACzD,MAAM,MAAM,GACV,OAAO,CAAC,MAAM;QACd,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,IAAA,qBAAe,EAAC,CAAC,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;IAEvF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,+CAA+C;SACzD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,IAAI,IAAA,qBAAe,EAAC,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC,IAAI,2BAA2B,CAAC;IAEhJ,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,EAAE;YAChD,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC;SAChC,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,QAAQ,CAAC,EAAE;YACtB,OAAO,EAAE,QAAQ,CAAC,EAAE;gBAClB,CAAC,CAAC,iDAAiD;gBACnD,CAAC,CAAC,yCAAyC,QAAQ,CAAC,MAAM,GAAG;SAChE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,+BAAgC,KAAe,CAAC,OAAO,EAAE;SACnE,CAAC;IACJ,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,OAAmB;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,IAAI,IAAA,qBAAe,EAAC,CAAC,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,IAAI,wBAAwB,CAAC;IAEzI,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE;YAC/C,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC;SAChC,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,QAAQ,CAAC,EAAE;YACtB,OAAO,EAAE,QAAQ,CAAC,EAAE;gBAClB,CAAC,CAAC,sBAAsB;gBACxB,CAAC,CAAC,yCAAyC,QAAQ,CAAC,MAAM,GAAG;SAChE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,+BAAgC,KAAe,CAAC,OAAO,EAAE;SACnE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCommand = runCommand;
|
|
4
|
+
exports.printCommandReport = printCommandReport;
|
|
5
|
+
const ai_1 = require("./ai");
|
|
6
|
+
const codebase_context_1 = require("./codebase-context");
|
|
7
|
+
const error_parser_1 = require("./error-parser");
|
|
8
|
+
const command_intelligence_1 = require("./command-intelligence");
|
|
9
|
+
const error_parser_2 = require("./error-parser");
|
|
10
|
+
const process_1 = require("./process");
|
|
11
|
+
const provider_health_1 = require("./provider-health");
|
|
12
|
+
const skills_1 = require("./skills");
|
|
13
|
+
const simulation_1 = require("./simulation");
|
|
14
|
+
function formatDuration(durationMs) {
|
|
15
|
+
if (durationMs < 1000) {
|
|
16
|
+
return `${durationMs}ms`;
|
|
17
|
+
}
|
|
18
|
+
return `${(durationMs / 1000).toFixed(2)}s`;
|
|
19
|
+
}
|
|
20
|
+
function trimBlock(value, limit = 2400) {
|
|
21
|
+
const trimmed = value.trim();
|
|
22
|
+
if (!trimmed) {
|
|
23
|
+
return "";
|
|
24
|
+
}
|
|
25
|
+
if (trimmed.length <= limit) {
|
|
26
|
+
return trimmed;
|
|
27
|
+
}
|
|
28
|
+
return `${trimmed.slice(0, limit)}\n...`;
|
|
29
|
+
}
|
|
30
|
+
function shouldUseAI(options) {
|
|
31
|
+
return options.explain || options.provider !== "none";
|
|
32
|
+
}
|
|
33
|
+
function shouldStreamExecution(options, intent) {
|
|
34
|
+
if (options.stream !== undefined) {
|
|
35
|
+
return options.stream;
|
|
36
|
+
}
|
|
37
|
+
if (options.json || options.silent) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return options.raw || intent.likelyLongRunning || intent.interactive;
|
|
41
|
+
}
|
|
42
|
+
async function runCommand(options, logger) {
|
|
43
|
+
const cwd = options.cwd ? options.cwd : process.cwd();
|
|
44
|
+
const intent = (0, command_intelligence_1.analyzeCommand)(options.commandArgs);
|
|
45
|
+
const resolvedMode = (0, command_intelligence_1.resolveExecutionMode)(options.mode, intent);
|
|
46
|
+
const skills = (0, skills_1.resolveSkills)(options.skills);
|
|
47
|
+
const providerHealth = shouldUseAI(options)
|
|
48
|
+
? await Promise.all([(0, provider_health_1.checkOpenAIHealth)(options), (0, provider_health_1.checkOllamaHealth)(options)])
|
|
49
|
+
: undefined;
|
|
50
|
+
const preferredProviderHealthy = providerHealth?.some((health) => {
|
|
51
|
+
if (options.provider === "openai") {
|
|
52
|
+
return health.provider === "openai" && health.configured;
|
|
53
|
+
}
|
|
54
|
+
if (options.provider === "ollama") {
|
|
55
|
+
return health.provider === "ollama" && health.reachable;
|
|
56
|
+
}
|
|
57
|
+
return (health.provider === "openai" && health.configured) || (health.provider === "ollama" && health.reachable);
|
|
58
|
+
}) ?? false;
|
|
59
|
+
if (intent.unsupportedReason) {
|
|
60
|
+
return {
|
|
61
|
+
command: options.command,
|
|
62
|
+
cwd,
|
|
63
|
+
requestedMode: options.mode,
|
|
64
|
+
resolvedMode: "run",
|
|
65
|
+
intent,
|
|
66
|
+
parsedError: {
|
|
67
|
+
category: "unsupported",
|
|
68
|
+
headline: "Command must run in your current shell",
|
|
69
|
+
summary: intent.unsupportedReason,
|
|
70
|
+
evidence: [intent.unsupportedReason],
|
|
71
|
+
suggestions: ["Run this command directly in your shell instead of through why-cli."],
|
|
72
|
+
fileReferences: [],
|
|
73
|
+
stackFrames: [],
|
|
74
|
+
signals: ["shell-builtin"],
|
|
75
|
+
},
|
|
76
|
+
aiError: undefined,
|
|
77
|
+
providerHealth,
|
|
78
|
+
ok: false,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (resolvedMode === "simulate") {
|
|
82
|
+
const simulation = await (0, simulation_1.simulateCommand)(options.commandArgs, intent, cwd);
|
|
83
|
+
let aiExplanation = null;
|
|
84
|
+
let aiError;
|
|
85
|
+
if (shouldUseAI(options) && preferredProviderHealthy) {
|
|
86
|
+
try {
|
|
87
|
+
aiExplanation = await (0, ai_1.explainSimulationWithAI)({
|
|
88
|
+
options,
|
|
89
|
+
command: options.command,
|
|
90
|
+
intent,
|
|
91
|
+
simulation,
|
|
92
|
+
skills,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
aiExplanation = null;
|
|
97
|
+
aiError = error.message;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
command: options.command,
|
|
102
|
+
cwd,
|
|
103
|
+
requestedMode: options.mode,
|
|
104
|
+
resolvedMode,
|
|
105
|
+
intent,
|
|
106
|
+
simulation,
|
|
107
|
+
aiExplanation,
|
|
108
|
+
aiError,
|
|
109
|
+
providerHealth,
|
|
110
|
+
ok: simulation.verdict === "ready",
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const streamExecution = shouldStreamExecution(options, intent);
|
|
114
|
+
if (streamExecution && !options.raw && !options.json && !options.silent) {
|
|
115
|
+
logger.heading("why-cli", "Streaming live command output");
|
|
116
|
+
logger.badge("Command", options.command, "accent");
|
|
117
|
+
logger.badge("Mode", `${options.mode} -> ${resolvedMode}`, "muted");
|
|
118
|
+
logger.badge("Risk", `${intent.risk} (${intent.family}:${intent.action})`, "info");
|
|
119
|
+
logger.list(intent.reasons, "muted");
|
|
120
|
+
logger.section("Live Output");
|
|
121
|
+
}
|
|
122
|
+
const execution = await (0, process_1.runProcess)(options.commandArgs, {
|
|
123
|
+
cwd,
|
|
124
|
+
timeoutMs: options.timeoutMs,
|
|
125
|
+
streamOutput: streamExecution,
|
|
126
|
+
inheritStdin: streamExecution,
|
|
127
|
+
onStdout: streamExecution ? (chunk) => logger.rawStdout(chunk) : undefined,
|
|
128
|
+
onStderr: streamExecution ? (chunk) => logger.rawStderr(chunk) : undefined,
|
|
129
|
+
});
|
|
130
|
+
const parsedError = execution.signal === "SIGINT"
|
|
131
|
+
? (0, error_parser_1.createInterruptedError)(options.command, execution.signal)
|
|
132
|
+
: execution.ok && !execution.timedOut
|
|
133
|
+
? undefined
|
|
134
|
+
: (0, error_parser_2.parseError)(options.command, execution.stdout, execution.stderr, execution.timedOut ? -1 : execution.exitCode);
|
|
135
|
+
let aiExplanation = null;
|
|
136
|
+
let aiError;
|
|
137
|
+
const codeContext = parsedError ? (0, codebase_context_1.collectCodeContext)(cwd, `${execution.stderr}\n${execution.stdout}`) : [];
|
|
138
|
+
if (parsedError && shouldUseAI(options) && preferredProviderHealthy) {
|
|
139
|
+
try {
|
|
140
|
+
aiExplanation = await (0, ai_1.explainFailureWithAI)({
|
|
141
|
+
options,
|
|
142
|
+
command: options.command,
|
|
143
|
+
intent,
|
|
144
|
+
parsedError,
|
|
145
|
+
stdout: execution.stdout,
|
|
146
|
+
stderr: execution.stderr,
|
|
147
|
+
skills,
|
|
148
|
+
codeContext,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
aiExplanation = null;
|
|
153
|
+
aiError = error.message;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
command: options.command,
|
|
158
|
+
cwd,
|
|
159
|
+
requestedMode: options.mode,
|
|
160
|
+
resolvedMode,
|
|
161
|
+
intent,
|
|
162
|
+
execution,
|
|
163
|
+
parsedError,
|
|
164
|
+
aiExplanation,
|
|
165
|
+
aiError,
|
|
166
|
+
providerHealth,
|
|
167
|
+
ok: execution.ok,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function printCommandReport(session, options, logger) {
|
|
171
|
+
if (options.json) {
|
|
172
|
+
logger.printJson(session);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (options.raw && session.execution) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const streamed = session.execution?.streamedOutput ?? false;
|
|
179
|
+
if (streamed) {
|
|
180
|
+
logger.section("Summary");
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
logger.heading("why-cli", session.resolvedMode === "simulate"
|
|
184
|
+
? `Simulation ${session.ok ? "looks ready" : "found issues"}`
|
|
185
|
+
: `${session.ok ? "Command completed" : "Command failed"}${session.execution ? ` in ${formatDuration(session.execution.durationMs)}` : ""}`);
|
|
186
|
+
}
|
|
187
|
+
logger.badge("Command", session.command, "accent");
|
|
188
|
+
logger.badge("Mode", `${session.requestedMode} -> ${session.resolvedMode}`, "muted");
|
|
189
|
+
logger.badge("Intent", session.intent.intentLabel, "accent");
|
|
190
|
+
logger.badge("Risk", `${session.intent.risk} (${session.intent.family}:${session.intent.action})`, session.ok ? "info" : "warn");
|
|
191
|
+
logger.list(session.intent.reasons, "muted");
|
|
192
|
+
if (session.simulation) {
|
|
193
|
+
logger.section("Simulation");
|
|
194
|
+
logger.badge("Verdict", session.simulation.verdict, session.simulation.verdict === "ready" ? "success" : "warn");
|
|
195
|
+
logger.badge("Confidence", `${session.simulation.confidence}%`, session.simulation.confidence >= 80 ? "success" : "info");
|
|
196
|
+
logger.line(session.simulation.summary);
|
|
197
|
+
logger.list(session.simulation.checks, "info");
|
|
198
|
+
for (const artifact of session.simulation.artifacts) {
|
|
199
|
+
logger.block(artifact.title, trimBlock(artifact.body, 1800), "muted");
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (session.execution) {
|
|
203
|
+
logger.badge("Status", session.execution.ok
|
|
204
|
+
? `success in ${formatDuration(session.execution.durationMs)}`
|
|
205
|
+
: `exit ${session.execution.exitCode ?? "unknown"}${session.execution.signal ? ` (${session.execution.signal})` : ""}`, session.execution.ok ? "success" : "error");
|
|
206
|
+
if (session.execution.ok) {
|
|
207
|
+
if (session.execution.streamedOutput) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const body = trimBlock(session.execution.stdout, 2600);
|
|
211
|
+
if (body) {
|
|
212
|
+
logger.section("Output");
|
|
213
|
+
logger.line(body);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else if (session.parsedError) {
|
|
217
|
+
logger.section(session.parsedError.headline);
|
|
218
|
+
logger.line(session.parsedError.summary);
|
|
219
|
+
logger.list(session.parsedError.evidence.map((item) => `Evidence: ${item}`), "warn");
|
|
220
|
+
const fallbackSuggestions = session.aiExplanation
|
|
221
|
+
? session.parsedError.suggestions.slice(0, 1)
|
|
222
|
+
: session.parsedError.suggestions;
|
|
223
|
+
logger.list(fallbackSuggestions.map((item) => `Try: ${item}`), "info");
|
|
224
|
+
}
|
|
225
|
+
const capturedOutput = trimBlock(session.execution.stderr || session.execution.stdout, 2200);
|
|
226
|
+
if (!session.execution.ok && capturedOutput && !session.execution.streamedOutput) {
|
|
227
|
+
logger.section("Captured Output");
|
|
228
|
+
logger.line(capturedOutput);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (!session.execution && session.parsedError) {
|
|
232
|
+
logger.section(session.parsedError.headline);
|
|
233
|
+
logger.line(session.parsedError.summary);
|
|
234
|
+
logger.list(session.parsedError.suggestions.map((item) => `Try: ${item}`), "info");
|
|
235
|
+
}
|
|
236
|
+
if (session.aiExplanation) {
|
|
237
|
+
logger.section(session.aiExplanation.headline);
|
|
238
|
+
logger.badge("AI", `${session.aiExplanation.provider}:${session.aiExplanation.model} (${session.aiExplanation.confidence})`, "accent");
|
|
239
|
+
logger.line(session.aiExplanation.summary);
|
|
240
|
+
if (session.aiExplanation.mostLikelyCause) {
|
|
241
|
+
logger.section("Most Likely Cause");
|
|
242
|
+
logger.line(session.aiExplanation.mostLikelyCause);
|
|
243
|
+
}
|
|
244
|
+
if (session.aiExplanation.nextSteps.length > 0) {
|
|
245
|
+
logger.section("Next Steps");
|
|
246
|
+
logger.list(session.aiExplanation.nextSteps, "info");
|
|
247
|
+
}
|
|
248
|
+
if (session.aiExplanation.guardrails.length > 0) {
|
|
249
|
+
logger.section("Guardrails");
|
|
250
|
+
logger.list(session.aiExplanation.guardrails, "warn");
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else if (session.aiError) {
|
|
254
|
+
logger.section("AI");
|
|
255
|
+
logger.line(`AI explanation failed: ${session.aiError}`);
|
|
256
|
+
}
|
|
257
|
+
else if (shouldUseAI(options)) {
|
|
258
|
+
logger.section("AI");
|
|
259
|
+
logger.line("No AI narration was generated. Configure OpenAI credentials or make sure a local Ollama server is running.");
|
|
260
|
+
}
|
|
261
|
+
if (session.providerHealth && session.providerHealth.length > 0) {
|
|
262
|
+
logger.section("Provider Health");
|
|
263
|
+
logger.list(session.providerHealth.map((health) => `${health.provider}: ${health.configured ? "configured" : "missing config"}, ${health.reachable ? "reachable" : "not reachable"} - ${health.message}`), "muted");
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
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.runSetup = runSetup;
|
|
7
|
+
const promises_1 = __importDefault(require("readline/promises"));
|
|
8
|
+
const process_1 = require("process");
|
|
9
|
+
const env_1 = require("./env");
|
|
10
|
+
function maskSecret(value) {
|
|
11
|
+
if (!value) {
|
|
12
|
+
return "(empty)";
|
|
13
|
+
}
|
|
14
|
+
if (value.length <= 6) {
|
|
15
|
+
return "*".repeat(value.length);
|
|
16
|
+
}
|
|
17
|
+
return `${value.slice(0, 3)}...${value.slice(-3)}`;
|
|
18
|
+
}
|
|
19
|
+
function cowLogo(color = true) {
|
|
20
|
+
const cyan = color ? "\x1b[36m" : "";
|
|
21
|
+
const yellow = color ? "\x1b[33m" : "";
|
|
22
|
+
const reset = color ? "\x1b[0m" : "";
|
|
23
|
+
return [
|
|
24
|
+
`${cyan} ______________________________ ${reset}`,
|
|
25
|
+
`${cyan}< why-cli setup: ship it fast >${reset}`,
|
|
26
|
+
`${cyan} ------------------------------ ${reset}`,
|
|
27
|
+
`${yellow} \\ ^__^${reset}`,
|
|
28
|
+
`${yellow} \\ (oo)\\_______${reset}`,
|
|
29
|
+
`${yellow} (__)\\ )\\/\\\\${reset}`,
|
|
30
|
+
`${yellow} ||----w |${reset}`,
|
|
31
|
+
`${yellow} || ||${reset}`,
|
|
32
|
+
].join("\n");
|
|
33
|
+
}
|
|
34
|
+
async function askWithDefault(rl, question, fallback) {
|
|
35
|
+
const answer = (await rl.question(`${question} [${fallback}]: `)).trim();
|
|
36
|
+
return answer || fallback;
|
|
37
|
+
}
|
|
38
|
+
async function runSetup(options, logger) {
|
|
39
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
40
|
+
throw new Error("`why --setup` requires an interactive terminal.");
|
|
41
|
+
}
|
|
42
|
+
logger.line(cowLogo(options.color));
|
|
43
|
+
logger.heading("why-cli setup", `This will save defaults to ${(0, env_1.getGlobalEnvPath)()}`);
|
|
44
|
+
const rl = promises_1.default.createInterface({ input: process_1.stdin, output: process_1.stdout });
|
|
45
|
+
try {
|
|
46
|
+
const defaultProvider = (0, env_1.resolveEnvAlias)(["WHY_PROVIDER"]) ??
|
|
47
|
+
((0, env_1.resolveEnvAlias)(["OPENAI_API_KEY", "OPENAI_APIKEY", "OPENAIAPIKEY", "openaiapikey"]) ? "openai" : "ollama");
|
|
48
|
+
const provider = (await askWithDefault(rl, "Provider (auto/openai/ollama/none)", defaultProvider ?? "ollama"));
|
|
49
|
+
const openaiApiKey = provider === "openai" || provider === "auto"
|
|
50
|
+
? await askWithDefault(rl, "OpenAI API key", (0, env_1.resolveEnvAlias)(["OPENAI_API_KEY", "OPENAI_APIKEY", "OPENAIAPIKEY", "openaiapikey"]) ?? "")
|
|
51
|
+
: "";
|
|
52
|
+
const openaiModel = await askWithDefault(rl, "OpenAI model", (0, env_1.resolveEnvAlias)(["OPENAI_MODEL", "openaimodel"]) ?? "gpt-4.1");
|
|
53
|
+
const openaiBaseUrl = await askWithDefault(rl, "OpenAI base URL", (0, env_1.resolveEnvAlias)(["OPENAI_BASE_URL", "OPENAI_BASEURL", "openaibaseurl"]) ?? "https://api.openai.com/v1");
|
|
54
|
+
const ollamaHost = await askWithDefault(rl, "Ollama host", (0, env_1.resolveEnvAlias)(["OLLAMA_HOST", "OLLAMA_URL", "ollamaurl", "ollamahost"]) ?? "http://127.0.0.1:11434");
|
|
55
|
+
const ollamaModel = await askWithDefault(rl, "Ollama model", (0, env_1.resolveEnvAlias)(["OLLAMA_MODEL", "ollamamodel"]) ?? "gemma3:4b");
|
|
56
|
+
const skill = await askWithDefault(rl, "Default skills (comma separated)", (0, env_1.resolveEnvAlias)(["WHY_SKILL"]) ?? "debug,fix");
|
|
57
|
+
const filePath = (0, env_1.writeGlobalConfig)({
|
|
58
|
+
provider,
|
|
59
|
+
openaiApiKey,
|
|
60
|
+
openaiModel,
|
|
61
|
+
openaiBaseUrl,
|
|
62
|
+
ollamaHost,
|
|
63
|
+
ollamaModel,
|
|
64
|
+
skill,
|
|
65
|
+
});
|
|
66
|
+
logger.section("Saved");
|
|
67
|
+
logger.list([
|
|
68
|
+
`config file: ${filePath}`,
|
|
69
|
+
`provider: ${provider}`,
|
|
70
|
+
`openai key: ${maskSecret(openaiApiKey)}`,
|
|
71
|
+
`openai model: ${openaiModel}`,
|
|
72
|
+
`ollama host: ${ollamaHost}`,
|
|
73
|
+
`ollama model: ${ollamaModel}`,
|
|
74
|
+
`default skills: ${skill}`,
|
|
75
|
+
], "success");
|
|
76
|
+
logger.line("Run `why --doctor` next to verify the saved provider setup.");
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
rl.close();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/core/setup.ts"],"names":[],"mappings":"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"}
|