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/README.md +226 -0
- package/dist/analyzer.d.ts +58 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +203 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/cli.d.ts +28 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +442 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +118 -0
- package/dist/config.js.map +1 -0
- package/dist/executor.d.ts +71 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +315 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +126 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +142 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +19 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +336 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/models.d.ts +101 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +202 -0
- package/dist/models.js.map +1 -0
- package/dist/orchestrator.d.ts +61 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +325 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/prompts.d.ts +48 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +220 -0
- package/dist/prompts.js.map +1 -0
- package/dist/types.d.ts +125 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +87 -0
- package/dist/types.js.map +1 -0
- package/package.json +77 -0
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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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"}
|