codereview-aia 0.1.2 → 0.1.4
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/analysis/static/wpPhpcsRunner.d.ts +11 -0
- package/dist/analysis/static/wpPhpcsRunner.js +219 -0
- package/dist/analysis/static/wpPhpcsRunner.js.map +1 -0
- package/dist/clients/implementations/openRouterClient.js +2 -2
- package/dist/clients/implementations/openRouterClient.js.map +1 -1
- package/dist/clients/openRouterClient.js +2 -2
- package/dist/clients/openRouterClient.js.map +1 -1
- package/dist/clients/utils/promptFormatter.d.ts +3 -2
- package/dist/clients/utils/promptFormatter.js +82 -24
- package/dist/clients/utils/promptFormatter.js.map +1 -1
- package/dist/core/ConfigurationService.d.ts +21 -0
- package/dist/core/ConfigurationService.js +39 -0
- package/dist/core/ConfigurationService.js.map +1 -1
- package/dist/core/handlers/FileProcessingHandler.js +5 -0
- package/dist/core/handlers/FileProcessingHandler.js.map +1 -1
- package/dist/core/reviewOrchestrator.js +61 -1
- package/dist/core/reviewOrchestrator.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/runtime/cliEntry.js +57 -4
- package/dist/runtime/cliEntry.js.map +1 -1
- package/dist/runtime/fileCollector.d.ts +10 -1
- package/dist/runtime/fileCollector.js +217 -2
- package/dist/runtime/fileCollector.js.map +1 -1
- package/dist/runtime/reporting/markdownReportBuilder.d.ts +2 -0
- package/dist/runtime/reporting/markdownReportBuilder.js +57 -0
- package/dist/runtime/reporting/markdownReportBuilder.js.map +1 -1
- package/dist/runtime/reviewPipeline.d.ts +22 -3
- package/dist/runtime/reviewPipeline.js +46 -7
- package/dist/runtime/reviewPipeline.js.map +1 -1
- package/dist/runtime/runAiCodeReview.d.ts +19 -1
- package/dist/runtime/runAiCodeReview.js +243 -8
- package/dist/runtime/runAiCodeReview.js.map +1 -1
- package/dist/runtime/ui/RuntimeApp.js +15 -4
- package/dist/runtime/ui/RuntimeApp.js.map +1 -1
- package/dist/runtime/ui/screens/ProgressScreen.d.ts +6 -1
- package/dist/runtime/ui/screens/ProgressScreen.js +28 -2
- package/dist/runtime/ui/screens/ProgressScreen.js.map +1 -1
- package/dist/runtime/ui/screens/ResultsScreen.js +8 -1
- package/dist/runtime/ui/screens/ResultsScreen.js.map +1 -1
- package/dist/types/review.d.ts +60 -0
- package/dist/utils/detection/frameworkDetector.js +55 -0
- package/dist/utils/detection/frameworkDetector.js.map +1 -1
- package/dist/utils/promptTemplateManager.js +1 -0
- package/dist/utils/promptTemplateManager.js.map +1 -1
- package/package.json +13 -10
- package/.cr-aia.yml +0 -23
- package/.crignore +0 -0
- package/src/analysis/FindingsExtractor.ts +0 -431
- package/src/analysis/ai-detection/analyzers/BaseAnalyzer.ts +0 -267
- package/src/analysis/ai-detection/analyzers/DocumentationAnalyzer.ts +0 -622
- package/src/analysis/ai-detection/analyzers/GitHistoryAnalyzer.ts +0 -430
- package/src/analysis/ai-detection/core/AIDetectionEngine.ts +0 -467
- package/src/analysis/ai-detection/types/DetectionTypes.ts +0 -406
- package/src/analysis/ai-detection/utils/SubmissionConverter.ts +0 -390
- package/src/analysis/context/ReviewContext.ts +0 -378
- package/src/analysis/context/index.ts +0 -7
- package/src/analysis/index.ts +0 -8
- package/src/analysis/tokens/TokenAnalysisFormatter.ts +0 -154
- package/src/analysis/tokens/TokenAnalyzer.ts +0 -747
- package/src/analysis/tokens/index.ts +0 -8
- package/src/clients/base/abstractClient.ts +0 -190
- package/src/clients/base/httpClient.ts +0 -160
- package/src/clients/base/index.ts +0 -12
- package/src/clients/base/modelDetection.ts +0 -107
- package/src/clients/base/responseProcessor.ts +0 -586
- package/src/clients/factory/clientFactory.ts +0 -55
- package/src/clients/factory/index.ts +0 -8
- package/src/clients/implementations/index.ts +0 -8
- package/src/clients/implementations/openRouterClient.ts +0 -411
- package/src/clients/openRouterClient.ts +0 -863
- package/src/clients/openRouterClientWrapper.ts +0 -44
- package/src/clients/utils/directoryStructure.ts +0 -52
- package/src/clients/utils/index.ts +0 -11
- package/src/clients/utils/languageDetection.ts +0 -44
- package/src/clients/utils/promptFormatter.ts +0 -105
- package/src/clients/utils/promptLoader.ts +0 -53
- package/src/clients/utils/tokenCounter.ts +0 -297
- package/src/core/ApiClientSelector.ts +0 -37
- package/src/core/ConfigurationService.ts +0 -591
- package/src/core/ConsolidationService.ts +0 -423
- package/src/core/InteractiveDisplayManager.ts +0 -81
- package/src/core/OutputManager.ts +0 -275
- package/src/core/ReviewGenerator.ts +0 -140
- package/src/core/fileDiscovery.ts +0 -237
- package/src/core/handlers/EstimationHandler.ts +0 -104
- package/src/core/handlers/FileProcessingHandler.ts +0 -204
- package/src/core/handlers/OutputHandler.ts +0 -125
- package/src/core/handlers/ReviewExecutor.ts +0 -104
- package/src/core/reviewOrchestrator.ts +0 -333
- package/src/core/utils/ModelInfoUtils.ts +0 -56
- package/src/formatters/outputFormatter.ts +0 -62
- package/src/formatters/utils/IssueFormatters.ts +0 -83
- package/src/formatters/utils/JsonFormatter.ts +0 -77
- package/src/formatters/utils/MarkdownFormatters.ts +0 -609
- package/src/formatters/utils/MetadataFormatter.ts +0 -269
- package/src/formatters/utils/ModelInfoExtractor.ts +0 -115
- package/src/index.ts +0 -28
- package/src/plugins/PluginInterface.ts +0 -50
- package/src/plugins/PluginManager.ts +0 -126
- package/src/prompts/PromptManager.ts +0 -69
- package/src/prompts/cache/PromptCache.ts +0 -50
- package/src/prompts/promptText/common/variables/css-frameworks.json +0 -33
- package/src/prompts/promptText/common/variables/framework-versions.json +0 -45
- package/src/prompts/promptText/frameworks/react/comprehensive.hbs +0 -19
- package/src/prompts/promptText/languages/css/comprehensive.hbs +0 -18
- package/src/prompts/promptText/languages/generic/comprehensive.hbs +0 -20
- package/src/prompts/promptText/languages/html/comprehensive.hbs +0 -18
- package/src/prompts/promptText/languages/javascript/comprehensive.hbs +0 -18
- package/src/prompts/promptText/languages/python/comprehensive.hbs +0 -18
- package/src/prompts/promptText/languages/typescript/comprehensive.hbs +0 -18
- package/src/runtime/auth/service.ts +0 -58
- package/src/runtime/auth/session.ts +0 -103
- package/src/runtime/auth/types.ts +0 -11
- package/src/runtime/cliEntry.ts +0 -196
- package/src/runtime/debug/logManager.ts +0 -37
- package/src/runtime/errors.ts +0 -13
- package/src/runtime/fileCollector.ts +0 -222
- package/src/runtime/manifest.ts +0 -64
- package/src/runtime/openrouterProxy.ts +0 -45
- package/src/runtime/preprod/webCheck.ts +0 -104
- package/src/runtime/proxyConfig.ts +0 -94
- package/src/runtime/proxyEnvironment.ts +0 -71
- package/src/runtime/reportMerge.ts +0 -102
- package/src/runtime/reporting/markdownReportBuilder.ts +0 -138
- package/src/runtime/reporting/reportDataCollector.ts +0 -234
- package/src/runtime/reporting/summaryGenerator.ts +0 -86
- package/src/runtime/reviewPipeline.ts +0 -161
- package/src/runtime/runAiCodeReview.ts +0 -153
- package/src/runtime/runtimeConfig.ts +0 -5
- package/src/runtime/ui/Layout.tsx +0 -57
- package/src/runtime/ui/RuntimeApp.tsx +0 -233
- package/src/runtime/ui/inkModules.ts +0 -73
- package/src/runtime/ui/screens/AuthScreen.tsx +0 -128
- package/src/runtime/ui/screens/ModeSelection.tsx +0 -185
- package/src/runtime/ui/screens/ProgressScreen.tsx +0 -62
- package/src/runtime/ui/screens/ResultsScreen.tsx +0 -83
- package/src/strategies/ArchitecturalReviewStrategy.ts +0 -54
- package/src/strategies/CodingTestReviewStrategy.ts +0 -920
- package/src/strategies/ConsolidatedReviewStrategy.ts +0 -59
- package/src/strategies/ExtractPatternsReviewStrategy.ts +0 -64
- package/src/strategies/MultiPassReviewStrategy.ts +0 -785
- package/src/strategies/ReviewStrategy.ts +0 -64
- package/src/strategies/StrategyFactory.ts +0 -79
- package/src/strategies/index.ts +0 -14
- package/src/tokenizers/baseTokenizer.ts +0 -61
- package/src/tokenizers/gptTokenizer.ts +0 -27
- package/src/tokenizers/index.ts +0 -8
- package/src/types/apiResponses.ts +0 -40
- package/src/types/cli.ts +0 -24
- package/src/types/common.ts +0 -39
- package/src/types/configuration.ts +0 -201
- package/src/types/handlebars.d.ts +0 -5
- package/src/types/patch.d.ts +0 -25
- package/src/types/review.ts +0 -294
- package/src/types/reviewContext.d.ts +0 -65
- package/src/types/reviewSchema.ts +0 -181
- package/src/types/structuredReview.ts +0 -167
- package/src/types/tokenAnalysis.ts +0 -56
- package/src/utils/FileReader.ts +0 -93
- package/src/utils/FileWriter.ts +0 -76
- package/src/utils/PathGenerator.ts +0 -97
- package/src/utils/api/apiUtils.ts +0 -14
- package/src/utils/api/index.ts +0 -1
- package/src/utils/apiErrorHandler.ts +0 -287
- package/src/utils/ciDataCollector.ts +0 -252
- package/src/utils/codingTestConfigLoader.ts +0 -466
- package/src/utils/dependencies/aiDependencyAnalyzer.ts +0 -454
- package/src/utils/detection/frameworkDetector.ts +0 -879
- package/src/utils/detection/index.ts +0 -10
- package/src/utils/detection/projectTypeDetector.ts +0 -518
- package/src/utils/diagramGenerator.ts +0 -206
- package/src/utils/errorLogger.ts +0 -60
- package/src/utils/estimationUtils.ts +0 -407
- package/src/utils/fileFilters.ts +0 -373
- package/src/utils/fileSystem.ts +0 -57
- package/src/utils/index.ts +0 -36
- package/src/utils/logger.ts +0 -290
- package/src/utils/pathValidator.ts +0 -98
- package/src/utils/priorityFilter.ts +0 -59
- package/src/utils/projectDocs.ts +0 -189
- package/src/utils/promptPaths.ts +0 -29
- package/src/utils/promptTemplateManager.ts +0 -157
- package/src/utils/review/consolidateReview.ts +0 -553
- package/src/utils/review/fixDisplay.ts +0 -100
- package/src/utils/review/fixImplementation.ts +0 -61
- package/src/utils/review/index.ts +0 -36
- package/src/utils/review/interactiveProcessing.ts +0 -294
- package/src/utils/review/progressTracker.ts +0 -296
- package/src/utils/review/reviewExtraction.ts +0 -382
- package/src/utils/review/types.ts +0 -46
- package/src/utils/reviewActionHandler.ts +0 -18
- package/src/utils/reviewParser.ts +0 -253
- package/src/utils/sanitizer.ts +0 -238
- package/src/utils/smartFileSelector.ts +0 -255
- package/src/utils/templateLoader.ts +0 -514
- package/src/utils/treeGenerator.ts +0 -153
- package/tsconfig.build.json +0 -14
- package/tsconfig.json +0 -59
|
@@ -1,591 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Unified Configuration Service
|
|
3
|
-
*
|
|
4
|
-
* This service consolidates all configuration management into a single, cohesive module.
|
|
5
|
-
* It replaces the fragmented configuration files (config.ts, configFileManager.ts,
|
|
6
|
-
* configManager.ts, unifiedConfig.ts, codingTestConfigLoader.ts, envLoader.ts) with
|
|
7
|
-
* a single source of truth for configuration.
|
|
8
|
-
*
|
|
9
|
-
* Key features:
|
|
10
|
-
* - Single source of truth for all configuration
|
|
11
|
-
* - Clear precedence order: CLI > Environment > Config File > Defaults
|
|
12
|
-
* - Type-safe configuration with Zod validation
|
|
13
|
-
* - Support for YAML and JSON config files
|
|
14
|
-
* - Environment variable loading with .env.local support
|
|
15
|
-
* - Comprehensive error handling and validation
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import fs from 'node:fs';
|
|
19
|
-
import path from 'node:path';
|
|
20
|
-
// Use dynamic import for js-yaml to avoid type issues
|
|
21
|
-
// import * as yaml from 'js-yaml';
|
|
22
|
-
import * as dotenv from 'dotenv';
|
|
23
|
-
import { z } from 'zod';
|
|
24
|
-
import type { CliOptions } from '../types/cli';
|
|
25
|
-
import logger from '../utils/logger';
|
|
26
|
-
import { resolvePromptTemplatesDir } from '../utils/promptPaths';
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Safely converts optional string inputs (like env vars) to numbers.
|
|
30
|
-
* Returns undefined when the input is absent or not a valid finite number.
|
|
31
|
-
*/
|
|
32
|
-
const toOptionalNumber = (value?: string): number | undefined => {
|
|
33
|
-
if (value === undefined || value === null || value === '') {
|
|
34
|
-
return undefined;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const parsed = Number(value);
|
|
38
|
-
return Number.isFinite(parsed) ? parsed : undefined;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
// Configuration schema with validation
|
|
42
|
-
const ConfigSchema = z.object({
|
|
43
|
-
// API Keys (OpenRouter only)
|
|
44
|
-
openRouterApiKey: z.string().optional(),
|
|
45
|
-
|
|
46
|
-
// Model configuration
|
|
47
|
-
model: z.string().default('openrouter:anthropic/claude-3-opus-20240229'),
|
|
48
|
-
writerModel: z.string().optional(),
|
|
49
|
-
|
|
50
|
-
// Output configuration
|
|
51
|
-
outputDir: z.string().default('cr-aia-docs'),
|
|
52
|
-
outputFormat: z.enum(['markdown', 'json']).default('markdown'),
|
|
53
|
-
|
|
54
|
-
// Behavior configuration
|
|
55
|
-
debug: z.boolean().default(false),
|
|
56
|
-
logLevel: z.enum(['debug', 'info', 'warn', 'error', 'none']).default('info'),
|
|
57
|
-
interactive: z.boolean().default(false),
|
|
58
|
-
|
|
59
|
-
// Review features
|
|
60
|
-
includeTests: z.boolean().default(false),
|
|
61
|
-
includeProjectDocs: z.boolean().default(true),
|
|
62
|
-
includeDependencyAnalysis: z.boolean().default(true),
|
|
63
|
-
|
|
64
|
-
// Multi-pass configuration
|
|
65
|
-
multiPass: z.boolean().default(false),
|
|
66
|
-
forceSinglePass: z.boolean().default(false),
|
|
67
|
-
contextMaintenanceFactor: z.number().min(0).max(1).default(0.15),
|
|
68
|
-
|
|
69
|
-
// Advanced features
|
|
70
|
-
testApi: z.boolean().default(false),
|
|
71
|
-
estimate: z.boolean().default(false),
|
|
72
|
-
noConfirm: z.boolean().default(false),
|
|
73
|
-
|
|
74
|
-
// Paths
|
|
75
|
-
contextPaths: z.array(z.string()).optional(),
|
|
76
|
-
configPath: z.string().optional(),
|
|
77
|
-
|
|
78
|
-
// Coding test specific
|
|
79
|
-
assignmentFile: z.string().optional(),
|
|
80
|
-
assignmentUrl: z.string().optional(),
|
|
81
|
-
assignmentText: z.string().optional(),
|
|
82
|
-
evaluationTemplate: z.string().optional(),
|
|
83
|
-
templateUrl: z.string().optional(),
|
|
84
|
-
rubricFile: z.string().optional(),
|
|
85
|
-
assessmentType: z
|
|
86
|
-
.enum(['coding-challenge', 'take-home', 'live-coding', 'code-review'])
|
|
87
|
-
.default('coding-challenge'),
|
|
88
|
-
difficultyLevel: z.enum(['junior', 'mid', 'senior', 'lead', 'architect']).default('mid'),
|
|
89
|
-
|
|
90
|
-
// Evaluation weights
|
|
91
|
-
weightCorrectness: z.number().min(0).max(100).default(30),
|
|
92
|
-
weightCodeQuality: z.number().min(0).max(100).default(25),
|
|
93
|
-
weightArchitecture: z.number().min(0).max(100).default(20),
|
|
94
|
-
weightPerformance: z.number().min(0).max(100).default(15),
|
|
95
|
-
weightTesting: z.number().min(0).max(100).default(10),
|
|
96
|
-
|
|
97
|
-
// Evaluation options
|
|
98
|
-
evaluateDocumentation: z.boolean().default(false),
|
|
99
|
-
evaluateGitHistory: z.boolean().default(false),
|
|
100
|
-
evaluateEdgeCases: z.boolean().default(false),
|
|
101
|
-
evaluateErrorHandling: z.boolean().default(false),
|
|
102
|
-
|
|
103
|
-
// Scoring system
|
|
104
|
-
scoringSystem: z.enum(['numeric', 'letter', 'pass-fail', 'custom']).default('numeric'),
|
|
105
|
-
maxScore: z.number().default(100),
|
|
106
|
-
passingThreshold: z.number().default(70),
|
|
107
|
-
scoreBreakdown: z.boolean().default(true),
|
|
108
|
-
|
|
109
|
-
// Feedback configuration
|
|
110
|
-
feedbackLevel: z.enum(['basic', 'detailed', 'comprehensive']).default('detailed'),
|
|
111
|
-
includeExamples: z.boolean().default(true),
|
|
112
|
-
includeSuggestions: z.boolean().default(true),
|
|
113
|
-
includeResources: z.boolean().default(false),
|
|
114
|
-
|
|
115
|
-
// AI detection
|
|
116
|
-
enableAiDetection: z.boolean().default(false),
|
|
117
|
-
aiDetectionThreshold: z.number().min(0).max(1).default(0.7),
|
|
118
|
-
aiDetectionAnalyzers: z.string().default('git,documentation'),
|
|
119
|
-
aiDetectionIncludeInReport: z.boolean().default(true),
|
|
120
|
-
aiDetectionFailOnDetection: z.boolean().default(false),
|
|
121
|
-
|
|
122
|
-
// Constraints
|
|
123
|
-
allowedLibraries: z.array(z.string()).optional(),
|
|
124
|
-
forbiddenPatterns: z.array(z.string()).optional(),
|
|
125
|
-
nodeVersion: z.string().optional(),
|
|
126
|
-
typescriptVersion: z.string().optional(),
|
|
127
|
-
memoryLimit: z.number().optional(),
|
|
128
|
-
executionTimeout: z.number().optional(),
|
|
129
|
-
timeLimit: z.number().optional(),
|
|
130
|
-
|
|
131
|
-
// Diagram generation
|
|
132
|
-
diagram: z.boolean().default(false),
|
|
133
|
-
|
|
134
|
-
// Batch processing
|
|
135
|
-
batchTokenLimit: z.number().optional(),
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
export type Config = z.infer<typeof ConfigSchema>;
|
|
139
|
-
|
|
140
|
-
// Configuration file interface (supports both YAML and JSON)
|
|
141
|
-
interface ConfigFile {
|
|
142
|
-
api?: {
|
|
143
|
-
openrouter_api_key?: string;
|
|
144
|
-
model?: string;
|
|
145
|
-
writer_model?: string;
|
|
146
|
-
test_api?: boolean;
|
|
147
|
-
};
|
|
148
|
-
model?: {
|
|
149
|
-
default?: string;
|
|
150
|
-
writer?: string;
|
|
151
|
-
};
|
|
152
|
-
output?: {
|
|
153
|
-
directory?: string;
|
|
154
|
-
dir?: string;
|
|
155
|
-
format?: 'markdown' | 'json';
|
|
156
|
-
};
|
|
157
|
-
behavior?: {
|
|
158
|
-
debug?: boolean;
|
|
159
|
-
log_level?: string;
|
|
160
|
-
interactive?: boolean;
|
|
161
|
-
};
|
|
162
|
-
features?: {
|
|
163
|
-
include_tests?: boolean;
|
|
164
|
-
include_project_docs?: boolean;
|
|
165
|
-
include_dependency_analysis?: boolean;
|
|
166
|
-
enable_semantic_chunking?: boolean;
|
|
167
|
-
multi_pass?: boolean;
|
|
168
|
-
force_single_pass?: boolean;
|
|
169
|
-
};
|
|
170
|
-
review?: {
|
|
171
|
-
type?: string;
|
|
172
|
-
interactive?: boolean;
|
|
173
|
-
include_tests?: boolean;
|
|
174
|
-
include_project_docs?: boolean;
|
|
175
|
-
include_dependency_analysis?: boolean;
|
|
176
|
-
consolidated?: boolean;
|
|
177
|
-
trace_code?: boolean;
|
|
178
|
-
use_ts_prune?: boolean;
|
|
179
|
-
use_eslint?: boolean;
|
|
180
|
-
auto_fix?: boolean;
|
|
181
|
-
prompt_all?: boolean;
|
|
182
|
-
confirm?: boolean;
|
|
183
|
-
};
|
|
184
|
-
system?: {
|
|
185
|
-
debug?: boolean;
|
|
186
|
-
log_level?: string;
|
|
187
|
-
};
|
|
188
|
-
prompts?: {
|
|
189
|
-
prompt_file?: string;
|
|
190
|
-
prompt_fragment?: string;
|
|
191
|
-
prompt_fragment_position?: 'start' | 'middle' | 'end';
|
|
192
|
-
prompt_strategy?: string;
|
|
193
|
-
use_cache?: boolean;
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Unified Configuration Service
|
|
199
|
-
*
|
|
200
|
-
* This class provides a single source of truth for all configuration management.
|
|
201
|
-
* It handles loading from CLI arguments, environment variables, and config files
|
|
202
|
-
* with a clear precedence order.
|
|
203
|
-
*/
|
|
204
|
-
export class ConfigurationService {
|
|
205
|
-
private static instance: ConfigurationService | null = null;
|
|
206
|
-
private config: Config | null = null;
|
|
207
|
-
|
|
208
|
-
private constructor() {}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Get the singleton instance of the configuration service
|
|
212
|
-
*/
|
|
213
|
-
public static getInstance(): ConfigurationService {
|
|
214
|
-
if (!ConfigurationService.instance) {
|
|
215
|
-
ConfigurationService.instance = new ConfigurationService();
|
|
216
|
-
}
|
|
217
|
-
return ConfigurationService.instance;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Get the current configuration
|
|
222
|
-
* @param cliOptions Optional CLI options to override configuration
|
|
223
|
-
* @returns The validated configuration object
|
|
224
|
-
*/
|
|
225
|
-
public getConfig(cliOptions?: CliOptions): Config {
|
|
226
|
-
if (!this.config || cliOptions) {
|
|
227
|
-
this.config = this.buildConfiguration(cliOptions);
|
|
228
|
-
}
|
|
229
|
-
return this.config;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Reset the configuration (useful for testing)
|
|
234
|
-
*/
|
|
235
|
-
public resetConfig(): void {
|
|
236
|
-
this.config = null;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Check if any API key is available
|
|
241
|
-
*/
|
|
242
|
-
public hasAnyApiKey(config?: Config): boolean {
|
|
243
|
-
const cfg = config || this.getConfig();
|
|
244
|
-
return !!cfg.openRouterApiKey;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Get paths configuration
|
|
249
|
-
*/
|
|
250
|
-
public getPathsConfig(): {
|
|
251
|
-
outputDir: string;
|
|
252
|
-
promptsDir: string;
|
|
253
|
-
templatesDir: string;
|
|
254
|
-
contextPaths?: string[];
|
|
255
|
-
} {
|
|
256
|
-
const config = this.getConfig();
|
|
257
|
-
const promptsDir = resolvePromptTemplatesDir();
|
|
258
|
-
return {
|
|
259
|
-
outputDir: config.outputDir || 'cr-aia-docs',
|
|
260
|
-
promptsDir,
|
|
261
|
-
templatesDir: promptsDir,
|
|
262
|
-
contextPaths: config.contextPaths,
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Get application config (for backward compatibility)
|
|
268
|
-
*/
|
|
269
|
-
public getApplicationConfig(): {
|
|
270
|
-
selectedModel: { value: string; source: string };
|
|
271
|
-
openRouterApiKey?: { value: string; source: string };
|
|
272
|
-
debug: { value: boolean; source: string };
|
|
273
|
-
logLevel: { value: string; source: string };
|
|
274
|
-
outputDir: { value: string; source: string };
|
|
275
|
-
} {
|
|
276
|
-
const config = this.getConfig();
|
|
277
|
-
return {
|
|
278
|
-
selectedModel: {
|
|
279
|
-
value: config.model,
|
|
280
|
-
source: 'configuration_service',
|
|
281
|
-
},
|
|
282
|
-
openRouterApiKey: config.openRouterApiKey
|
|
283
|
-
? {
|
|
284
|
-
value: config.openRouterApiKey,
|
|
285
|
-
source: 'environment',
|
|
286
|
-
}
|
|
287
|
-
: undefined,
|
|
288
|
-
debug: {
|
|
289
|
-
value: config.debug,
|
|
290
|
-
source: 'configuration_service',
|
|
291
|
-
},
|
|
292
|
-
logLevel: {
|
|
293
|
-
value: config.logLevel,
|
|
294
|
-
source: 'configuration_service',
|
|
295
|
-
},
|
|
296
|
-
outputDir: {
|
|
297
|
-
value: config.outputDir,
|
|
298
|
-
source: 'configuration_service',
|
|
299
|
-
},
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Build the configuration from all sources with proper precedence
|
|
305
|
-
*/
|
|
306
|
-
private buildConfiguration(cliOptions?: CliOptions): Config {
|
|
307
|
-
// 1. Load environment variables from .env.local
|
|
308
|
-
this.loadEnvironmentVariables();
|
|
309
|
-
|
|
310
|
-
// 2. Load configuration file
|
|
311
|
-
const configFile = this.loadConfigFile(cliOptions?.config);
|
|
312
|
-
|
|
313
|
-
// 3. Build configuration with precedence: CLI > Environment > Config File > Defaults
|
|
314
|
-
const rawConfig = this.mergeConfigurationSources(cliOptions, configFile);
|
|
315
|
-
|
|
316
|
-
// 4. Validate and return the configuration
|
|
317
|
-
try {
|
|
318
|
-
return ConfigSchema.parse(rawConfig);
|
|
319
|
-
} catch (error) {
|
|
320
|
-
logger.error('Configuration validation failed:', error);
|
|
321
|
-
throw new Error(`Invalid configuration: ${error}`);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Load environment variables from .env.local file
|
|
327
|
-
*/
|
|
328
|
-
private loadEnvironmentVariables(): void {
|
|
329
|
-
const envLocalPath = path.join(process.cwd(), '.env.local');
|
|
330
|
-
|
|
331
|
-
if (fs.existsSync(envLocalPath)) {
|
|
332
|
-
try {
|
|
333
|
-
dotenv.config({ path: envLocalPath, override: true });
|
|
334
|
-
logger.debug(`Loaded environment variables from ${envLocalPath}`);
|
|
335
|
-
} catch (error) {
|
|
336
|
-
logger.warn(`Failed to load environment variables from ${envLocalPath}:`, error);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
/**
|
|
342
|
-
* Load configuration file (YAML or JSON)
|
|
343
|
-
*/
|
|
344
|
-
private loadConfigFile(configPath?: string): ConfigFile | null {
|
|
345
|
-
const defaultConfigFiles = [
|
|
346
|
-
'.cr-aia.yml',
|
|
347
|
-
];
|
|
348
|
-
|
|
349
|
-
const filesToTry = configPath ? [configPath] : defaultConfigFiles;
|
|
350
|
-
|
|
351
|
-
for (const filePath of filesToTry) {
|
|
352
|
-
const fullPath = path.resolve(filePath);
|
|
353
|
-
|
|
354
|
-
if (fs.existsSync(fullPath)) {
|
|
355
|
-
try {
|
|
356
|
-
const content = fs.readFileSync(fullPath, 'utf8');
|
|
357
|
-
const extension = path.extname(fullPath).toLowerCase();
|
|
358
|
-
|
|
359
|
-
let config: ConfigFile;
|
|
360
|
-
if (extension === '.json') {
|
|
361
|
-
config = JSON.parse(content);
|
|
362
|
-
} else if (extension === '.yaml' || extension === '.yml') {
|
|
363
|
-
// Use dynamic import for js-yaml
|
|
364
|
-
const yaml = require('js-yaml');
|
|
365
|
-
config = yaml.load(content) as ConfigFile;
|
|
366
|
-
} else {
|
|
367
|
-
logger.warn(`Unsupported config file format: ${extension}`);
|
|
368
|
-
continue;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
logger.debug(`Loaded configuration from ${fullPath}`);
|
|
372
|
-
return config;
|
|
373
|
-
} catch (error) {
|
|
374
|
-
logger.error(`Failed to load config file ${fullPath}:`, error);
|
|
375
|
-
if (configPath) {
|
|
376
|
-
throw error; // If explicitly specified, throw the error
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
return null;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
/**
|
|
386
|
-
* Merge configuration from all sources with proper precedence
|
|
387
|
-
*/
|
|
388
|
-
private mergeConfigurationSources(
|
|
389
|
-
cliOptions?: CliOptions,
|
|
390
|
-
configFile?: ConfigFile | null,
|
|
391
|
-
): Partial<Config> {
|
|
392
|
-
return {
|
|
393
|
-
// API Keys (OpenRouter only, environment only, not exposed via CLI for security)
|
|
394
|
-
openRouterApiKey: this.getApiKey('openrouter'),
|
|
395
|
-
|
|
396
|
-
// Model configuration
|
|
397
|
-
model:
|
|
398
|
-
cliOptions?.model ||
|
|
399
|
-
process.env.AI_CODE_REVIEW_MODEL ||
|
|
400
|
-
configFile?.model?.default ||
|
|
401
|
-
configFile?.api?.model ||
|
|
402
|
-
'openrouter:anthropic/claude-3-opus-20240229',
|
|
403
|
-
|
|
404
|
-
writerModel:
|
|
405
|
-
cliOptions?.writerModel ||
|
|
406
|
-
process.env.AI_CODE_REVIEW_WRITER_MODEL ||
|
|
407
|
-
configFile?.model?.writer ||
|
|
408
|
-
configFile?.api?.writer_model,
|
|
409
|
-
|
|
410
|
-
// Output configuration
|
|
411
|
-
outputDir:
|
|
412
|
-
cliOptions?.outputDir ||
|
|
413
|
-
process.env.AI_CODE_REVIEW_OUTPUT_DIR ||
|
|
414
|
-
configFile?.output?.directory ||
|
|
415
|
-
configFile?.output?.dir ||
|
|
416
|
-
'cr-aia-docs',
|
|
417
|
-
|
|
418
|
-
outputFormat:
|
|
419
|
-
(cliOptions?.output as 'markdown' | 'json') ||
|
|
420
|
-
(process.env.AI_CODE_REVIEW_OUTPUT_FORMAT as 'markdown' | 'json') ||
|
|
421
|
-
configFile?.output?.format ||
|
|
422
|
-
'markdown',
|
|
423
|
-
|
|
424
|
-
// Behavior configuration
|
|
425
|
-
debug:
|
|
426
|
-
cliOptions?.debug ??
|
|
427
|
-
(process.env.AI_CODE_REVIEW_DEBUG === 'true' ? true : undefined) ??
|
|
428
|
-
configFile?.behavior?.debug ??
|
|
429
|
-
configFile?.system?.debug ??
|
|
430
|
-
false,
|
|
431
|
-
|
|
432
|
-
logLevel:
|
|
433
|
-
(cliOptions?.logLevel as any) ||
|
|
434
|
-
(process.env.AI_CODE_REVIEW_LOG_LEVEL as any) ||
|
|
435
|
-
configFile?.behavior?.log_level ||
|
|
436
|
-
configFile?.system?.log_level ||
|
|
437
|
-
'info',
|
|
438
|
-
|
|
439
|
-
interactive:
|
|
440
|
-
cliOptions?.interactive ??
|
|
441
|
-
(process.env.AI_CODE_REVIEW_INTERACTIVE === 'true' ? true : undefined) ??
|
|
442
|
-
configFile?.behavior?.interactive ??
|
|
443
|
-
configFile?.review?.interactive ??
|
|
444
|
-
false,
|
|
445
|
-
|
|
446
|
-
// Review features
|
|
447
|
-
includeTests:
|
|
448
|
-
cliOptions?.includeTests ??
|
|
449
|
-
(process.env.AI_CODE_REVIEW_INCLUDE_TESTS === 'true' ? true : undefined) ??
|
|
450
|
-
configFile?.features?.include_tests ??
|
|
451
|
-
configFile?.review?.include_tests ??
|
|
452
|
-
false,
|
|
453
|
-
|
|
454
|
-
includeProjectDocs:
|
|
455
|
-
cliOptions?.includeProjectDocs ??
|
|
456
|
-
(process.env.AI_CODE_REVIEW_INCLUDE_PROJECT_DOCS === 'true' ? true : undefined) ??
|
|
457
|
-
configFile?.features?.include_project_docs ??
|
|
458
|
-
configFile?.review?.include_project_docs ??
|
|
459
|
-
true,
|
|
460
|
-
|
|
461
|
-
includeDependencyAnalysis:
|
|
462
|
-
cliOptions?.includeDependencyAnalysis ??
|
|
463
|
-
(process.env.AI_CODE_REVIEW_INCLUDE_DEPENDENCY_ANALYSIS === 'true' ? true : undefined) ??
|
|
464
|
-
configFile?.features?.include_dependency_analysis ??
|
|
465
|
-
configFile?.review?.include_dependency_analysis ??
|
|
466
|
-
true,
|
|
467
|
-
|
|
468
|
-
// Multi-pass configuration
|
|
469
|
-
multiPass:
|
|
470
|
-
cliOptions?.multiPass ??
|
|
471
|
-
(process.env.AI_CODE_REVIEW_MULTI_PASS === 'true' ? true : undefined) ??
|
|
472
|
-
configFile?.features?.multi_pass ??
|
|
473
|
-
false,
|
|
474
|
-
|
|
475
|
-
forceSinglePass:
|
|
476
|
-
cliOptions?.forceSinglePass ??
|
|
477
|
-
(process.env.AI_CODE_REVIEW_FORCE_SINGLE_PASS === 'true' ? true : undefined) ??
|
|
478
|
-
configFile?.features?.force_single_pass ??
|
|
479
|
-
false,
|
|
480
|
-
|
|
481
|
-
contextMaintenanceFactor:
|
|
482
|
-
cliOptions?.contextMaintenanceFactor ??
|
|
483
|
-
toOptionalNumber(process.env.AI_CODE_REVIEW_CONTEXT_MAINTENANCE_FACTOR) ??
|
|
484
|
-
0.15,
|
|
485
|
-
|
|
486
|
-
// Advanced features
|
|
487
|
-
testApi:
|
|
488
|
-
cliOptions?.testApi ??
|
|
489
|
-
(process.env.AI_CODE_REVIEW_TEST_API === 'true' ? true : undefined) ??
|
|
490
|
-
configFile?.api?.test_api ??
|
|
491
|
-
false,
|
|
492
|
-
|
|
493
|
-
estimate:
|
|
494
|
-
cliOptions?.estimate ??
|
|
495
|
-
(process.env.AI_CODE_REVIEW_ESTIMATE === 'true' ? true : undefined) ??
|
|
496
|
-
false,
|
|
497
|
-
|
|
498
|
-
noConfirm:
|
|
499
|
-
cliOptions?.noConfirm ??
|
|
500
|
-
(process.env.AI_CODE_REVIEW_NO_CONFIRM === 'true' ? true : undefined) ??
|
|
501
|
-
!(configFile?.review?.confirm ?? true),
|
|
502
|
-
|
|
503
|
-
// Paths
|
|
504
|
-
contextPaths: undefined, // contextPaths is not available in CliOptions
|
|
505
|
-
configPath: cliOptions?.config,
|
|
506
|
-
|
|
507
|
-
// Coding test specific (from CLI options)
|
|
508
|
-
assignmentFile: cliOptions?.assignmentFile,
|
|
509
|
-
assignmentUrl: cliOptions?.assignmentUrl,
|
|
510
|
-
assignmentText: cliOptions?.assignmentText,
|
|
511
|
-
evaluationTemplate: cliOptions?.evaluationTemplate,
|
|
512
|
-
templateUrl: cliOptions?.templateUrl,
|
|
513
|
-
rubricFile: cliOptions?.rubricFile,
|
|
514
|
-
assessmentType: cliOptions?.assessmentType || 'coding-challenge',
|
|
515
|
-
difficultyLevel: cliOptions?.difficultyLevel || 'mid',
|
|
516
|
-
|
|
517
|
-
// Evaluation weights
|
|
518
|
-
weightCorrectness: cliOptions?.weightCorrectness ?? 30,
|
|
519
|
-
weightCodeQuality: cliOptions?.weightCodeQuality ?? 25,
|
|
520
|
-
weightArchitecture: cliOptions?.weightArchitecture ?? 20,
|
|
521
|
-
weightPerformance: cliOptions?.weightPerformance ?? 15,
|
|
522
|
-
weightTesting: cliOptions?.weightTesting ?? 10,
|
|
523
|
-
|
|
524
|
-
// Evaluation options
|
|
525
|
-
evaluateDocumentation: cliOptions?.evaluateDocumentation ?? false,
|
|
526
|
-
evaluateGitHistory: cliOptions?.evaluateGitHistory ?? false,
|
|
527
|
-
evaluateEdgeCases: cliOptions?.evaluateEdgeCases ?? false,
|
|
528
|
-
evaluateErrorHandling: cliOptions?.evaluateErrorHandling ?? false,
|
|
529
|
-
|
|
530
|
-
// Scoring system
|
|
531
|
-
scoringSystem: cliOptions?.scoringSystem || 'numeric',
|
|
532
|
-
maxScore: cliOptions?.maxScore ?? 100,
|
|
533
|
-
passingThreshold: cliOptions?.passingThreshold ?? 70,
|
|
534
|
-
scoreBreakdown: cliOptions?.scoreBreakdown ?? true,
|
|
535
|
-
|
|
536
|
-
// Feedback configuration
|
|
537
|
-
feedbackLevel: cliOptions?.feedbackLevel || 'detailed',
|
|
538
|
-
includeExamples: cliOptions?.includeExamples ?? true,
|
|
539
|
-
includeSuggestions: cliOptions?.includeSuggestions ?? true,
|
|
540
|
-
includeResources: cliOptions?.includeResources ?? false,
|
|
541
|
-
|
|
542
|
-
// AI detection
|
|
543
|
-
enableAiDetection: cliOptions?.enableAiDetection ?? false,
|
|
544
|
-
aiDetectionThreshold: cliOptions?.aiDetectionThreshold ?? 0.7,
|
|
545
|
-
aiDetectionAnalyzers: cliOptions?.aiDetectionAnalyzers || 'git,documentation',
|
|
546
|
-
aiDetectionIncludeInReport: cliOptions?.aiDetectionIncludeInReport ?? true,
|
|
547
|
-
aiDetectionFailOnDetection: cliOptions?.aiDetectionFailOnDetection ?? false,
|
|
548
|
-
|
|
549
|
-
// Constraints
|
|
550
|
-
allowedLibraries: cliOptions?.allowedLibraries,
|
|
551
|
-
forbiddenPatterns: cliOptions?.forbiddenPatterns,
|
|
552
|
-
nodeVersion: cliOptions?.nodeVersion,
|
|
553
|
-
typescriptVersion: cliOptions?.typescriptVersion,
|
|
554
|
-
memoryLimit: cliOptions?.memoryLimit,
|
|
555
|
-
executionTimeout: cliOptions?.executionTimeout,
|
|
556
|
-
timeLimit: cliOptions?.timeLimit,
|
|
557
|
-
|
|
558
|
-
// Diagram generation
|
|
559
|
-
diagram: cliOptions?.diagram ?? false,
|
|
560
|
-
|
|
561
|
-
// Batch processing
|
|
562
|
-
batchTokenLimit: cliOptions?.batchTokenLimit,
|
|
563
|
-
};
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
/**
|
|
567
|
-
* Get API key from environment variables (OpenRouter only)
|
|
568
|
-
*/
|
|
569
|
-
private getApiKey(provider: 'openrouter'): string | undefined {
|
|
570
|
-
if (provider === 'openrouter') {
|
|
571
|
-
return process.env.AI_CODE_REVIEW_OPENROUTER_API_KEY || process.env.OPENROUTER_API_KEY;
|
|
572
|
-
}
|
|
573
|
-
return undefined;
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
// Export singleton instance for easy access
|
|
578
|
-
export const configurationService = ConfigurationService.getInstance();
|
|
579
|
-
|
|
580
|
-
// Export convenience functions for backward compatibility
|
|
581
|
-
export function getConfig(cliOptions?: CliOptions): Config {
|
|
582
|
-
return configurationService.getConfig(cliOptions);
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
export function resetConfig(): void {
|
|
586
|
-
configurationService.resetConfig();
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
export function hasAnyApiKey(config?: Config): boolean {
|
|
590
|
-
return configurationService.hasAnyApiKey(config);
|
|
591
|
-
}
|