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 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-20250514"));
50
- console.log(chalk_1.default.white(" quack -p openai -m gpt-4o\n"));
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");
@@ -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-4o-mini"
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-20250514"
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-1.5-flash"
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-4o-mini",
133
- anthropic: "claude-sonnet-4-20250514",
134
- gemini: "gemini-1.5-flash",
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quackstack",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "description": "Your cracked unpaid intern for all things codebase related! AI-powered codebase search and Q&A.",
5
5
  "type": "module",
6
6
  "main": "dist/cli.cjs",