rlm-analyzer 1.1.0

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.js ADDED
@@ -0,0 +1,442 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * RLM Analyzer CLI
4
+ * Command-line interface for code analysis
5
+ *
6
+ * Usage:
7
+ * rlm <command> [options]
8
+ *
9
+ * Commands:
10
+ * summary Get a codebase summary
11
+ * arch Analyze architecture
12
+ * deps Analyze dependencies
13
+ * security Security analysis
14
+ * perf Performance analysis
15
+ * refactor Find refactoring opportunities
16
+ * find Find symbol usages
17
+ * explain Explain a file
18
+ * ask Ask a custom question
19
+ * config Configure API key
20
+ *
21
+ * Options:
22
+ * --dir, -d Directory to analyze (default: current)
23
+ * --verbose, -v Show detailed output
24
+ * --json Output as JSON
25
+ * --help, -h Show help
26
+ */
27
+ import * as path from 'path';
28
+ import { analyzeArchitecture, analyzeDependencies, analyzeSecurity, analyzePerformance, analyzeRefactoring, summarizeCodebase, findUsages, explainFile, askQuestion, } from './analyzer.js';
29
+ import { hasApiKey, initConfig, getApiKey } from './config.js';
30
+ import { getDefaultModel, resolveModelAlias, resolveModelConfig, AVAILABLE_MODELS, getAliasesDisplay, } from './models.js';
31
+ // ANSI colors
32
+ const colors = {
33
+ reset: '\x1b[0m',
34
+ bold: '\x1b[1m',
35
+ dim: '\x1b[2m',
36
+ red: '\x1b[31m',
37
+ green: '\x1b[32m',
38
+ yellow: '\x1b[33m',
39
+ blue: '\x1b[34m',
40
+ magenta: '\x1b[35m',
41
+ cyan: '\x1b[36m',
42
+ };
43
+ function log(message, color) {
44
+ if (color) {
45
+ console.log(`${colors[color]}${message}${colors.reset}`);
46
+ }
47
+ else {
48
+ console.log(message);
49
+ }
50
+ }
51
+ function printBanner() {
52
+ log('\n╔══════════════════════════════════════════╗', 'cyan');
53
+ log('║ RLM Analyzer - AI Code Analysis ║', 'cyan');
54
+ log('║ Powered by Recursive Language Models ║', 'cyan');
55
+ log('╚══════════════════════════════════════════╝\n', 'cyan');
56
+ }
57
+ function printHelp() {
58
+ printBanner();
59
+ // Resolve current model config dynamically
60
+ const modelConfig = resolveModelConfig();
61
+ const defaultModel = modelConfig.defaultModel;
62
+ // Format available models
63
+ const modelsDisplay = AVAILABLE_MODELS.map(m => {
64
+ const isDefault = m.id === defaultModel;
65
+ const marker = isDefault ? ' (current default)' : '';
66
+ return ` ${m.id.padEnd(26)} ${m.description}${marker}`;
67
+ }).join('\n');
68
+ // Format model aliases
69
+ const aliasesDisplay = getAliasesDisplay();
70
+ console.log(`${colors.bold}Usage:${colors.reset}
71
+ rlm <command> [options]
72
+
73
+ ${colors.bold}Commands:${colors.reset}
74
+ ${colors.green}summary${colors.reset} Get a codebase summary
75
+ ${colors.green}arch${colors.reset} Analyze architecture and structure
76
+ ${colors.green}deps${colors.reset} Analyze dependencies
77
+ ${colors.green}security${colors.reset} Security vulnerability analysis
78
+ ${colors.green}perf${colors.reset} Performance analysis
79
+ ${colors.green}refactor${colors.reset} Find refactoring opportunities
80
+ ${colors.green}find${colors.reset} <symbol> Find all usages of a symbol
81
+ ${colors.green}explain${colors.reset} <file> Explain a specific file
82
+ ${colors.green}ask${colors.reset} "<question>" Ask a custom question
83
+ ${colors.green}config${colors.reset} [api-key] Configure or show API key status
84
+ ${colors.green}test${colors.reset} Test API connection and model availability
85
+
86
+ ${colors.bold}Options:${colors.reset}
87
+ --dir, -d <path> Directory to analyze (default: current directory)
88
+ --model, -m <name> Model to use (default: ${defaultModel})
89
+ Can use aliases: fast, smart, pro, flash
90
+ --verbose, -v Show detailed turn-by-turn output
91
+ --json Output results as JSON
92
+ --help, -h Show this help message
93
+
94
+ ${colors.bold}Available Models:${colors.reset}
95
+ ${modelsDisplay}
96
+
97
+ ${colors.bold}Model Aliases:${colors.reset}
98
+ ${aliasesDisplay}
99
+
100
+ ${colors.bold}Model Configuration Priority:${colors.reset}
101
+ 1. CLI --model flag (highest)
102
+ 2. Environment: RLM_DEFAULT_MODEL, RLM_FALLBACK_MODEL
103
+ 3. Config file: ~/.rlm-analyzer/config.json
104
+ 4. Built-in defaults
105
+
106
+ ${colors.bold}Current Configuration:${colors.reset}
107
+ Default: ${modelConfig.defaultModel} (from ${modelConfig.defaultSource})
108
+ Fallback: ${modelConfig.fallbackModel} (from ${modelConfig.fallbackSource})
109
+
110
+ ${colors.bold}Examples:${colors.reset}
111
+ ${colors.dim}# Summarize current directory${colors.reset}
112
+ rlm summary
113
+
114
+ ${colors.dim}# Analyze with specific model${colors.reset}
115
+ rlm arch --model smart --dir /path/to/project
116
+
117
+ ${colors.dim}# Use alias for model${colors.reset}
118
+ rlm summary --model fast
119
+
120
+ ${colors.dim}# Find all usages of a function${colors.reset}
121
+ rlm find "handleSubmit"
122
+
123
+ ${colors.dim}# Ask a custom question${colors.reset}
124
+ rlm ask "How does authentication work in this codebase?"
125
+
126
+ ${colors.dim}# Configure API key${colors.reset}
127
+ rlm config YOUR_GEMINI_API_KEY
128
+
129
+ ${colors.dim}# Set default model via environment${colors.reset}
130
+ export RLM_DEFAULT_MODEL=fast
131
+ rlm summary
132
+
133
+ ${colors.bold}Configuration:${colors.reset}
134
+ Set your Gemini API key using one of these methods:
135
+ 1. Run: ${colors.cyan}rlm config YOUR_API_KEY${colors.reset}
136
+ 2. Set environment variable: ${colors.cyan}export GEMINI_API_KEY=your_key${colors.reset}
137
+ 3. Create .env file with: ${colors.cyan}GEMINI_API_KEY=your_key${colors.reset}
138
+
139
+ Model configuration in ~/.rlm-analyzer/config.json:
140
+ ${colors.dim}{
141
+ "apiKey": "your_key",
142
+ "models": {
143
+ "default": "gemini-3-flash-preview",
144
+ "fallback": "gemini-2.0-flash-exp"
145
+ }
146
+ }${colors.reset}
147
+
148
+ Get your API key at: ${colors.blue}https://makersuite.google.com/app/apikey${colors.reset}
149
+ `);
150
+ }
151
+ function parseArgs(args) {
152
+ // Get default model dynamically
153
+ const defaultModel = getDefaultModel();
154
+ const options = {
155
+ dir: process.cwd(),
156
+ model: defaultModel,
157
+ verbose: false,
158
+ json: false,
159
+ help: false,
160
+ };
161
+ let command = '';
162
+ let target;
163
+ let i = 0;
164
+ let modelFromCLI;
165
+ while (i < args.length) {
166
+ const arg = args[i];
167
+ if (arg === '--help' || arg === '-h') {
168
+ options.help = true;
169
+ }
170
+ else if (arg === '--verbose' || arg === '-v') {
171
+ options.verbose = true;
172
+ }
173
+ else if (arg === '--json') {
174
+ options.json = true;
175
+ }
176
+ else if (arg === '--dir' || arg === '-d') {
177
+ i++;
178
+ options.dir = path.resolve(args[i] || '.');
179
+ }
180
+ else if (arg.startsWith('--dir=')) {
181
+ options.dir = path.resolve(arg.slice(6));
182
+ }
183
+ else if (arg.startsWith('-d=')) {
184
+ options.dir = path.resolve(arg.slice(3));
185
+ }
186
+ else if (arg === '--model' || arg === '-m') {
187
+ i++;
188
+ modelFromCLI = args[i];
189
+ }
190
+ else if (arg.startsWith('--model=')) {
191
+ modelFromCLI = arg.slice(8);
192
+ }
193
+ else if (arg.startsWith('-m=')) {
194
+ modelFromCLI = arg.slice(3);
195
+ }
196
+ else if (!command) {
197
+ command = arg;
198
+ }
199
+ else if (!target) {
200
+ target = arg;
201
+ }
202
+ i++;
203
+ }
204
+ // Resolve model alias if provided via CLI
205
+ if (modelFromCLI) {
206
+ options.model = resolveModelAlias(modelFromCLI);
207
+ }
208
+ return { command, target, options };
209
+ }
210
+ function createTurnCallback(verbose) {
211
+ if (!verbose)
212
+ return undefined;
213
+ return (turn) => {
214
+ log(`\n--- Turn ${turn.turn} ---`, 'dim');
215
+ if (turn.code) {
216
+ log('Executing code...', 'yellow');
217
+ }
218
+ if (turn.executionResult) {
219
+ const preview = turn.executionResult.slice(0, 200);
220
+ log(`Output: ${preview}${turn.executionResult.length > 200 ? '...' : ''}`, 'dim');
221
+ }
222
+ if (turn.error) {
223
+ log(`Error: ${turn.error}`, 'red');
224
+ }
225
+ };
226
+ }
227
+ async function runCommand(command, target, options) {
228
+ const startTime = Date.now();
229
+ log(`\nAnalyzing: ${options.dir}`, 'dim');
230
+ log(`Model: ${options.model}`, 'dim');
231
+ log(`Command: ${command}${target ? ` ${target}` : ''}`, 'dim');
232
+ log('', 'reset');
233
+ const onTurnComplete = createTurnCallback(options.verbose);
234
+ const analysisOpts = { verbose: options.verbose, onTurnComplete, model: options.model };
235
+ let result;
236
+ switch (command) {
237
+ case 'summary':
238
+ result = await summarizeCodebase(options.dir, analysisOpts);
239
+ break;
240
+ case 'arch':
241
+ case 'architecture':
242
+ result = await analyzeArchitecture(options.dir, analysisOpts);
243
+ break;
244
+ case 'deps':
245
+ case 'dependencies':
246
+ result = await analyzeDependencies(options.dir, analysisOpts);
247
+ break;
248
+ case 'security':
249
+ result = await analyzeSecurity(options.dir, analysisOpts);
250
+ break;
251
+ case 'perf':
252
+ case 'performance':
253
+ result = await analyzePerformance(options.dir, analysisOpts);
254
+ break;
255
+ case 'refactor':
256
+ result = await analyzeRefactoring(options.dir, analysisOpts);
257
+ break;
258
+ case 'find':
259
+ if (!target) {
260
+ log('Error: Please specify a symbol to find', 'red');
261
+ log('Usage: rlm find <symbol-name>', 'dim');
262
+ process.exit(1);
263
+ }
264
+ result = await findUsages(options.dir, target, analysisOpts);
265
+ break;
266
+ case 'explain':
267
+ if (!target) {
268
+ log('Error: Please specify a file to explain', 'red');
269
+ log('Usage: rlm explain <file-path>', 'dim');
270
+ process.exit(1);
271
+ }
272
+ const filePath = path.isAbsolute(target) ? target : path.join(options.dir, target);
273
+ result = await explainFile(filePath, analysisOpts);
274
+ break;
275
+ case 'ask':
276
+ if (!target) {
277
+ log('Error: Please specify a question', 'red');
278
+ log('Usage: rlm ask "your question"', 'dim');
279
+ process.exit(1);
280
+ }
281
+ result = await askQuestion(options.dir, target, analysisOpts);
282
+ break;
283
+ default:
284
+ log(`Unknown command: ${command}`, 'red');
285
+ log('Run "rlm --help" for usage information', 'dim');
286
+ process.exit(1);
287
+ }
288
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
289
+ if (options.json) {
290
+ console.log(JSON.stringify(result, null, 2));
291
+ return;
292
+ }
293
+ // Print results
294
+ log('\n' + '═'.repeat(50), 'cyan');
295
+ log('ANALYSIS RESULT', 'bold');
296
+ log('═'.repeat(50), 'cyan');
297
+ if (result.success && result.answer) {
298
+ log('\n' + result.answer, 'reset');
299
+ }
300
+ else if (result.error) {
301
+ log(`\nError: ${result.error}`, 'red');
302
+ }
303
+ else {
304
+ log('\nAnalysis incomplete. No final answer generated.', 'yellow');
305
+ if (result.turns.length > 0) {
306
+ log('\nPartial output from turns:', 'dim');
307
+ for (const turn of result.turns.slice(-3)) {
308
+ if (turn.executionResult) {
309
+ log(turn.executionResult.slice(0, 500), 'dim');
310
+ }
311
+ }
312
+ }
313
+ }
314
+ log('\n' + '─'.repeat(50), 'dim');
315
+ log(`Files analyzed: ${result.filesAnalyzed.length}`, 'dim');
316
+ log(`Turns: ${result.turns.length}`, 'dim');
317
+ log(`Sub-LLM calls: ${result.subCallCount}`, 'dim');
318
+ log(`Time: ${duration}s`, 'dim');
319
+ }
320
+ /**
321
+ * Test Gemini API connection directly
322
+ */
323
+ async function testConnection(model) {
324
+ log('\nTesting Gemini API connection...', 'cyan');
325
+ log(`Model: ${model}`, 'dim');
326
+ try {
327
+ const { getAIClient } = await import('./config.js');
328
+ const ai = getAIClient();
329
+ log('Sending test request...', 'dim');
330
+ const response = await ai.models.generateContent({
331
+ model,
332
+ contents: 'Say "Hello, RLM Analyzer!" and nothing else.',
333
+ config: {
334
+ temperature: 0.1,
335
+ maxOutputTokens: 50,
336
+ },
337
+ });
338
+ if (response.text) {
339
+ log(`\n✓ API connection successful!`, 'green');
340
+ log(`Response: ${response.text}`, 'reset');
341
+ }
342
+ else {
343
+ log(`\n✗ No response text received`, 'yellow');
344
+ log(`Full response: ${JSON.stringify(response, null, 2)}`, 'dim');
345
+ }
346
+ }
347
+ catch (error) {
348
+ log(`\n✗ API connection failed!`, 'red');
349
+ if (error instanceof Error) {
350
+ log(`Error: ${error.message}`, 'red');
351
+ // Try to extract more details from the error
352
+ const errorObj = error;
353
+ if (errorObj.cause) {
354
+ log(`Cause: ${JSON.stringify(errorObj.cause)}`, 'dim');
355
+ }
356
+ if (errorObj.status) {
357
+ log(`Status: ${errorObj.status}`, 'dim');
358
+ }
359
+ if (errorObj.statusText) {
360
+ log(`Status Text: ${errorObj.statusText}`, 'dim');
361
+ }
362
+ if (errorObj.response) {
363
+ log(`Response: ${JSON.stringify(errorObj.response)}`, 'dim');
364
+ }
365
+ }
366
+ else {
367
+ log(`Error: ${String(error)}`, 'red');
368
+ }
369
+ log('\nTroubleshooting tips:', 'yellow');
370
+ log('1. Verify your API key is correct', 'dim');
371
+ log('2. Try a different model: --model gemini-2.0-flash-exp', 'dim');
372
+ log('3. Check if your API key has access to the model', 'dim');
373
+ log('4. Visit https://aistudio.google.com to verify API access', 'dim');
374
+ }
375
+ }
376
+ async function main() {
377
+ const args = process.argv.slice(2);
378
+ const { command, target, options } = parseArgs(args);
379
+ // Show help
380
+ if (options.help || !command) {
381
+ printHelp();
382
+ process.exit(0);
383
+ }
384
+ // Handle test command
385
+ if (command === 'test') {
386
+ if (!hasApiKey()) {
387
+ log('Error: API key not configured', 'red');
388
+ log('Run: rlm config YOUR_API_KEY', 'cyan');
389
+ process.exit(1);
390
+ }
391
+ await testConnection(options.model);
392
+ process.exit(0);
393
+ }
394
+ // Handle config command
395
+ if (command === 'config') {
396
+ if (target) {
397
+ initConfig(target);
398
+ log('API key saved successfully!', 'green');
399
+ }
400
+ else {
401
+ if (hasApiKey()) {
402
+ log('API key is configured', 'green');
403
+ try {
404
+ const key = getApiKey();
405
+ log(`Key: ${key.slice(0, 8)}...${key.slice(-4)}`, 'dim');
406
+ }
407
+ catch {
408
+ // Ignore
409
+ }
410
+ }
411
+ else {
412
+ log('API key not configured', 'yellow');
413
+ log('\nTo configure, run:', 'reset');
414
+ log(' rlm config YOUR_GEMINI_API_KEY', 'cyan');
415
+ log('\nOr set environment variable:', 'reset');
416
+ log(' export GEMINI_API_KEY=your_key', 'cyan');
417
+ }
418
+ }
419
+ process.exit(0);
420
+ }
421
+ // Check API key
422
+ if (!hasApiKey()) {
423
+ log('Error: Gemini API key not configured', 'red');
424
+ log('\nTo configure, run:', 'reset');
425
+ log(' rlm config YOUR_GEMINI_API_KEY', 'cyan');
426
+ log('\nOr set environment variable:', 'reset');
427
+ log(' export GEMINI_API_KEY=your_key', 'cyan');
428
+ log('\nGet your API key at:', 'reset');
429
+ log(' https://makersuite.google.com/app/apikey', 'blue');
430
+ process.exit(1);
431
+ }
432
+ printBanner();
433
+ try {
434
+ await runCommand(command, target, options);
435
+ }
436
+ catch (error) {
437
+ log(`\nError: ${error instanceof Error ? error.message : String(error)}`, 'red');
438
+ process.exit(1);
439
+ }
440
+ }
441
+ main();
442
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Configuration and API Key Management
3
+ * Supports multiple ways to provide the Gemini API key
4
+ */
5
+ import { GoogleGenAI } from '@google/genai';
6
+ export { DEFAULT_MODEL, FALLBACK_MODEL, getDefaultModel, getFallbackModel, resolveModelConfig, resolveModelAlias, MODEL_ALIASES, } from './models.js';
7
+ /**
8
+ * Get Gemini API key from environment or config
9
+ * Priority:
10
+ * 1. GEMINI_API_KEY environment variable
11
+ * 2. RLM_API_KEY environment variable
12
+ * 3. VITE_GEMINI_API_KEY (for Vite projects)
13
+ * 4. Config file at ~/.rlm-analyzer/config.json
14
+ */
15
+ export declare function getApiKey(): string;
16
+ /**
17
+ * Get the GoogleGenAI client instance
18
+ */
19
+ export declare function getAIClient(): GoogleGenAI;
20
+ /**
21
+ * Initialize configuration directory
22
+ */
23
+ export declare function initConfig(apiKey?: string): void;
24
+ /**
25
+ * Check if API key is configured
26
+ */
27
+ export declare function hasApiKey(): boolean;
28
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,aAAa,CAAC;AAmBrB;;;;;;;GAOG;AACH,wBAAgB,SAAS,IAAI,MAAM,CA4ClC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,WAAW,CAMzC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAiBhD;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAOnC"}
package/dist/config.js ADDED
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Configuration and API Key Management
3
+ * Supports multiple ways to provide the Gemini API key
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import * as os from 'os';
8
+ import * as dotenv from 'dotenv';
9
+ import { GoogleGenAI } from '@google/genai';
10
+ // Re-export model configuration from models.ts for backward compatibility
11
+ export { DEFAULT_MODEL, FALLBACK_MODEL, getDefaultModel, getFallbackModel, resolveModelConfig, resolveModelAlias, MODEL_ALIASES, } from './models.js';
12
+ // Load .env files from multiple locations
13
+ const envPaths = [
14
+ path.join(process.cwd(), '.env'),
15
+ path.join(process.cwd(), '.env.local'),
16
+ path.join(os.homedir(), '.rlm-analyzer', '.env'),
17
+ path.join(os.homedir(), '.config', 'rlm-analyzer', '.env'),
18
+ ];
19
+ for (const envPath of envPaths) {
20
+ if (fs.existsSync(envPath)) {
21
+ dotenv.config({ path: envPath });
22
+ }
23
+ }
24
+ /** Cached AI client */
25
+ let aiClient = null;
26
+ /**
27
+ * Get Gemini API key from environment or config
28
+ * Priority:
29
+ * 1. GEMINI_API_KEY environment variable
30
+ * 2. RLM_API_KEY environment variable
31
+ * 3. VITE_GEMINI_API_KEY (for Vite projects)
32
+ * 4. Config file at ~/.rlm-analyzer/config.json
33
+ */
34
+ export function getApiKey() {
35
+ // Check environment variables
36
+ const envKey = process.env.GEMINI_API_KEY
37
+ || process.env.RLM_API_KEY
38
+ || process.env.VITE_GEMINI_API_KEY;
39
+ if (envKey) {
40
+ return envKey;
41
+ }
42
+ // Check config file
43
+ const configPaths = [
44
+ path.join(os.homedir(), '.rlm-analyzer', 'config.json'),
45
+ path.join(os.homedir(), '.config', 'rlm-analyzer', 'config.json'),
46
+ ];
47
+ for (const configPath of configPaths) {
48
+ if (fs.existsSync(configPath)) {
49
+ try {
50
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
51
+ if (config.apiKey) {
52
+ return config.apiKey;
53
+ }
54
+ }
55
+ catch {
56
+ // Ignore parse errors
57
+ }
58
+ }
59
+ }
60
+ throw new Error(`
61
+ Gemini API key not found. Please set it using one of these methods:
62
+
63
+ 1. Environment variable:
64
+ export GEMINI_API_KEY=your_api_key
65
+
66
+ 2. .env file in your project:
67
+ GEMINI_API_KEY=your_api_key
68
+
69
+ 3. Global config file:
70
+ mkdir -p ~/.rlm-analyzer
71
+ echo '{"apiKey": "your_api_key"}' > ~/.rlm-analyzer/config.json
72
+
73
+ Get your API key at: https://aistudio.google.com/apikey
74
+ `);
75
+ }
76
+ /**
77
+ * Get the GoogleGenAI client instance
78
+ */
79
+ export function getAIClient() {
80
+ if (!aiClient) {
81
+ const apiKey = getApiKey();
82
+ aiClient = new GoogleGenAI({ apiKey });
83
+ }
84
+ return aiClient;
85
+ }
86
+ /**
87
+ * Initialize configuration directory
88
+ */
89
+ export function initConfig(apiKey) {
90
+ const configDir = path.join(os.homedir(), '.rlm-analyzer');
91
+ const configPath = path.join(configDir, 'config.json');
92
+ if (!fs.existsSync(configDir)) {
93
+ fs.mkdirSync(configDir, { recursive: true });
94
+ }
95
+ if (apiKey) {
96
+ fs.writeFileSync(configPath, JSON.stringify({ apiKey }, null, 2));
97
+ console.log(`Configuration saved to ${configPath}`);
98
+ // Reset cached client so it uses the new key
99
+ aiClient = null;
100
+ }
101
+ else {
102
+ console.log(`Configuration directory: ${configDir}`);
103
+ console.log(`Config file: ${configPath}`);
104
+ }
105
+ }
106
+ /**
107
+ * Check if API key is configured
108
+ */
109
+ export function hasApiKey() {
110
+ try {
111
+ getApiKey();
112
+ return true;
113
+ }
114
+ catch {
115
+ return false;
116
+ }
117
+ }
118
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}