quackstack 1.0.18 → 1.0.20
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.cjs +4 -3
- package/dist/lib/ai-provider.js +70 -7
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -24,7 +24,7 @@ program
|
|
|
24
24
|
.option("--readme", "Generate README.md from your codebase")
|
|
25
25
|
.option("--cursor", "[DEPRECATED] Use --context instead")
|
|
26
26
|
.option("-w, --watch", "Watch mode: auto-update context files on file changes")
|
|
27
|
-
.option("-p, --provider <provider>", "AI provider: openai, anthropic, gemini, deepseek, mistral")
|
|
27
|
+
.option("-p, --provider <provider>", "AI provider: openai, anthropic, gemini, deepseek, mistral, grok")
|
|
28
28
|
.option("-m, --model <model>", "Specific model to use")
|
|
29
29
|
.option("--list-models", "List available providers and models")
|
|
30
30
|
.action(async (options) => {
|
|
@@ -46,8 +46,9 @@ program
|
|
|
46
46
|
});
|
|
47
47
|
});
|
|
48
48
|
console.log(chalk_1.default.cyan("\nUsage:"));
|
|
49
|
-
console.log(chalk_1.default.white(" quack --provider anthropic --model claude-sonnet-4-
|
|
50
|
-
console.log(chalk_1.default.white(" quack -p openai -m gpt-
|
|
49
|
+
console.log(chalk_1.default.white(" quack --provider anthropic --model claude-sonnet-4-5-20250929"));
|
|
50
|
+
console.log(chalk_1.default.white(" quack -p openai -m gpt-5.2"));
|
|
51
|
+
console.log(chalk_1.default.white(" quack -p grok -m grok-4\n"));
|
|
51
52
|
process.exit(0);
|
|
52
53
|
}
|
|
53
54
|
const title = chalk_animation_1.default.rainbow("QuackStack\n");
|
package/dist/lib/ai-provider.js
CHANGED
|
@@ -11,6 +11,7 @@ export class AIClient {
|
|
|
11
11
|
gemini;
|
|
12
12
|
deepseek;
|
|
13
13
|
mistral;
|
|
14
|
+
grok;
|
|
14
15
|
constructor(providerOverride, modelOverride) {
|
|
15
16
|
const config = this.detectProvider(providerOverride);
|
|
16
17
|
this.provider = config.provider;
|
|
@@ -30,7 +31,8 @@ export class AIClient {
|
|
|
30
31
|
" QUACKSTACK_ANTHROPIC_KEY\n" +
|
|
31
32
|
" QUACKSTACK_GEMINI_KEY\n" +
|
|
32
33
|
" QUACKSTACK_DEEPSEEK_KEY\n" +
|
|
33
|
-
" QUACKSTACK_MISTRAL_KEY"
|
|
34
|
+
" QUACKSTACK_MISTRAL_KEY\n" +
|
|
35
|
+
" QUACKSTACK_GROK_KEY");
|
|
34
36
|
}
|
|
35
37
|
if (override) {
|
|
36
38
|
const providerConfig = availableProviders.find(p => p.provider === override);
|
|
@@ -58,6 +60,7 @@ export class AIClient {
|
|
|
58
60
|
gemini: process.env.QUACKSTACK_GEMINI_KEY || "",
|
|
59
61
|
deepseek: process.env.QUACKSTACK_DEEPSEEK_KEY || "",
|
|
60
62
|
mistral: process.env.QUACKSTACK_MISTRAL_KEY || "",
|
|
63
|
+
grok: process.env.QUACKSTACK_GROK_KEY || "",
|
|
61
64
|
};
|
|
62
65
|
return keyMap[provider] || undefined;
|
|
63
66
|
}
|
|
@@ -68,12 +71,20 @@ export class AIClient {
|
|
|
68
71
|
provider: "openai",
|
|
69
72
|
name: "OpenAI",
|
|
70
73
|
models: [
|
|
74
|
+
"gpt-5.2",
|
|
75
|
+
"gpt-5.2-instant",
|
|
76
|
+
"gpt-5.2-thinking",
|
|
77
|
+
"gpt-5.2-pro",
|
|
78
|
+
"gpt-5.1",
|
|
79
|
+
"o3",
|
|
80
|
+
"o3-pro",
|
|
81
|
+
"o4-mini",
|
|
71
82
|
"gpt-4o",
|
|
72
83
|
"gpt-4o-mini",
|
|
73
84
|
"gpt-4-turbo",
|
|
74
85
|
"gpt-3.5-turbo"
|
|
75
86
|
],
|
|
76
|
-
defaultModel: "gpt-
|
|
87
|
+
defaultModel: "gpt-5.2"
|
|
77
88
|
});
|
|
78
89
|
}
|
|
79
90
|
if (process.env.QUACKSTACK_ANTHROPIC_KEY) {
|
|
@@ -81,12 +92,16 @@ export class AIClient {
|
|
|
81
92
|
provider: "anthropic",
|
|
82
93
|
name: "Anthropic",
|
|
83
94
|
models: [
|
|
95
|
+
"claude-opus-4-5-20251124",
|
|
96
|
+
"claude-opus-4-1-20250805",
|
|
84
97
|
"claude-opus-4-20250514",
|
|
98
|
+
"claude-sonnet-4-5-20250929",
|
|
85
99
|
"claude-sonnet-4-20250514",
|
|
100
|
+
"claude-haiku-4-5-20251015",
|
|
86
101
|
"claude-3-7-sonnet-20250219",
|
|
87
102
|
"claude-3-5-haiku-20241022"
|
|
88
103
|
],
|
|
89
|
-
defaultModel: "claude-sonnet-4-
|
|
104
|
+
defaultModel: "claude-sonnet-4-5-20250929"
|
|
90
105
|
});
|
|
91
106
|
}
|
|
92
107
|
if (process.env.QUACKSTACK_GEMINI_KEY) {
|
|
@@ -94,12 +109,17 @@ export class AIClient {
|
|
|
94
109
|
provider: "gemini",
|
|
95
110
|
name: "Gemini",
|
|
96
111
|
models: [
|
|
112
|
+
"gemini-3-pro",
|
|
113
|
+
"gemini-3-deep-think",
|
|
114
|
+
"gemini-2.5-pro",
|
|
115
|
+
"gemini-2.5-flash",
|
|
116
|
+
"gemini-2.5-flash-lite",
|
|
97
117
|
"gemini-2.0-flash-exp",
|
|
98
118
|
"gemini-1.5-pro",
|
|
99
119
|
"gemini-1.5-flash",
|
|
100
120
|
"gemini-1.5-flash-8b"
|
|
101
121
|
],
|
|
102
|
-
defaultModel: "gemini-
|
|
122
|
+
defaultModel: "gemini-3-pro"
|
|
103
123
|
});
|
|
104
124
|
}
|
|
105
125
|
if (process.env.QUACKSTACK_DEEPSEEK_KEY) {
|
|
@@ -125,15 +145,36 @@ export class AIClient {
|
|
|
125
145
|
defaultModel: "mistral-large-latest"
|
|
126
146
|
});
|
|
127
147
|
}
|
|
148
|
+
if (process.env.QUACKSTACK_GROK_KEY) {
|
|
149
|
+
providers.push({
|
|
150
|
+
provider: "grok",
|
|
151
|
+
name: "xAI Grok",
|
|
152
|
+
models: [
|
|
153
|
+
"grok-4-1-fast-reasoning",
|
|
154
|
+
"grok-4-1-fast-non-reasoning",
|
|
155
|
+
"grok-4-fast-reasoning",
|
|
156
|
+
"grok-4-fast-non-reasoning",
|
|
157
|
+
"grok-code-fast-1",
|
|
158
|
+
"grok-4",
|
|
159
|
+
"grok-3",
|
|
160
|
+
"grok-3-mini",
|
|
161
|
+
"grok-2-vision-1212",
|
|
162
|
+
"grok-2-image-1212",
|
|
163
|
+
"grok-2-1212"
|
|
164
|
+
],
|
|
165
|
+
defaultModel: "grok-4"
|
|
166
|
+
});
|
|
167
|
+
}
|
|
128
168
|
return providers;
|
|
129
169
|
}
|
|
130
170
|
getDefaultModel(provider) {
|
|
131
171
|
const defaults = {
|
|
132
|
-
openai: "gpt-
|
|
133
|
-
anthropic: "claude-sonnet-4-
|
|
134
|
-
gemini: "gemini-
|
|
172
|
+
openai: "gpt-5.2",
|
|
173
|
+
anthropic: "claude-sonnet-4-5-20250929",
|
|
174
|
+
gemini: "gemini-3-pro",
|
|
135
175
|
deepseek: "deepseek-chat",
|
|
136
176
|
mistral: "mistral-large-latest",
|
|
177
|
+
grok: "grok-4",
|
|
137
178
|
};
|
|
138
179
|
return defaults[provider];
|
|
139
180
|
}
|
|
@@ -160,6 +201,12 @@ export class AIClient {
|
|
|
160
201
|
baseURL: "https://api.mistral.ai/v1",
|
|
161
202
|
});
|
|
162
203
|
break;
|
|
204
|
+
case "grok":
|
|
205
|
+
this.grok = new OpenAI({
|
|
206
|
+
apiKey: config.apiKey,
|
|
207
|
+
baseURL: "https://api.x.ai/v1",
|
|
208
|
+
});
|
|
209
|
+
break;
|
|
163
210
|
}
|
|
164
211
|
}
|
|
165
212
|
async generateAnswer(query, context) {
|
|
@@ -178,6 +225,8 @@ export class AIClient {
|
|
|
178
225
|
return await this.generateDeepSeek(systemPrompt, userPrompt);
|
|
179
226
|
case "mistral":
|
|
180
227
|
return await this.generateMistral(systemPrompt, userPrompt);
|
|
228
|
+
case "grok":
|
|
229
|
+
return await this.generateGrok(systemPrompt, userPrompt);
|
|
181
230
|
default:
|
|
182
231
|
throw new Error(`Unsupported provider: ${this.provider}`);
|
|
183
232
|
}
|
|
@@ -249,6 +298,19 @@ export class AIClient {
|
|
|
249
298
|
});
|
|
250
299
|
return response.choices[0].message.content || "No response generated.";
|
|
251
300
|
}
|
|
301
|
+
async generateGrok(systemPrompt, userPrompt) {
|
|
302
|
+
if (!this.grok)
|
|
303
|
+
throw new Error("Grok client not initialized");
|
|
304
|
+
const response = await this.grok.chat.completions.create({
|
|
305
|
+
model: this.model,
|
|
306
|
+
messages: [
|
|
307
|
+
{ role: "system", content: systemPrompt },
|
|
308
|
+
{ role: "user", content: userPrompt },
|
|
309
|
+
],
|
|
310
|
+
temperature: 0.3,
|
|
311
|
+
});
|
|
312
|
+
return response.choices[0].message.content || "No response generated.";
|
|
313
|
+
}
|
|
252
314
|
getProviderName() {
|
|
253
315
|
const names = {
|
|
254
316
|
openai: "OpenAI",
|
|
@@ -256,6 +318,7 @@ export class AIClient {
|
|
|
256
318
|
gemini: "Gemini",
|
|
257
319
|
deepseek: "DeepSeek",
|
|
258
320
|
mistral: "Mistral",
|
|
321
|
+
grok: "xAI Grok",
|
|
259
322
|
};
|
|
260
323
|
return names[this.provider];
|
|
261
324
|
}
|