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,128 +0,0 @@
|
|
|
1
|
-
import React, { useCallback, useEffect, useState } from 'react';
|
|
2
|
-
import type { SessionUser } from '../../auth/types';
|
|
3
|
-
import { authenticate } from '../../auth/service';
|
|
4
|
-
import { saveSession } from '../../auth/session';
|
|
5
|
-
import { useLayout } from '../Layout';
|
|
6
|
-
import { getInk, getInkSpinner, getInkTextInput } from '../inkModules';
|
|
7
|
-
|
|
8
|
-
interface AuthScreenProps {
|
|
9
|
-
onAuth: (user: SessionUser) => void;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function AuthScreen({ onAuth }: AuthScreenProps) {
|
|
13
|
-
const { frameWidth } = useLayout();
|
|
14
|
-
const { Box, Text, useInput } = getInk();
|
|
15
|
-
const Spinner = getInkSpinner();
|
|
16
|
-
const TextInput = getInkTextInput();
|
|
17
|
-
const [username, setUsername] = useState('');
|
|
18
|
-
const [password, setPassword] = useState('');
|
|
19
|
-
const [error, setError] = useState<string | null>(null);
|
|
20
|
-
const [submitting, setSubmitting] = useState(false);
|
|
21
|
-
const [step, setStep] = useState<'username' | 'password'>('username');
|
|
22
|
-
|
|
23
|
-
const handleSubmit = useCallback(async () => {
|
|
24
|
-
if (submitting) return;
|
|
25
|
-
|
|
26
|
-
if (!username.trim() || !password.trim()) {
|
|
27
|
-
setError('Username and password are required');
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
try {
|
|
32
|
-
setSubmitting(true);
|
|
33
|
-
setError(null);
|
|
34
|
-
const result = await authenticate(username.trim(), password.trim());
|
|
35
|
-
saveSession(result.token);
|
|
36
|
-
process.env.CR_AIA_PROXY_SESSION_TOKEN = result.token;
|
|
37
|
-
onAuth(result.user);
|
|
38
|
-
} catch (authError) {
|
|
39
|
-
const message = authError instanceof Error ? authError.message : 'Authentication failed';
|
|
40
|
-
setError(message);
|
|
41
|
-
setSubmitting(false);
|
|
42
|
-
}
|
|
43
|
-
}, [username, password, submitting, onAuth]);
|
|
44
|
-
|
|
45
|
-
const handleAdvance = useCallback(() => {
|
|
46
|
-
if (step === 'password') {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (!username.trim()) {
|
|
50
|
-
setError('Username is required');
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
setError(null);
|
|
54
|
-
setStep('password');
|
|
55
|
-
}, [step, username]);
|
|
56
|
-
|
|
57
|
-
useInput((input, key) => {
|
|
58
|
-
if (key.return) {
|
|
59
|
-
if (step === 'username') {
|
|
60
|
-
handleAdvance();
|
|
61
|
-
} else {
|
|
62
|
-
handleSubmit();
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
useEffect(() => {
|
|
68
|
-
setError(null);
|
|
69
|
-
}, [username, password]);
|
|
70
|
-
|
|
71
|
-
return (
|
|
72
|
-
<Box
|
|
73
|
-
width={frameWidth}
|
|
74
|
-
flexDirection="column"
|
|
75
|
-
borderStyle="round"
|
|
76
|
-
borderColor="cyan"
|
|
77
|
-
paddingX={2}
|
|
78
|
-
paddingY={1}
|
|
79
|
-
gap={1}
|
|
80
|
-
>
|
|
81
|
-
<Text color="cyan" bold>
|
|
82
|
-
Sign in
|
|
83
|
-
</Text>
|
|
84
|
-
<Text dimColor>
|
|
85
|
-
{step === 'username' ? 'Type your username, press Enter.' : 'Type your password, press Enter to submit.'}
|
|
86
|
-
</Text>
|
|
87
|
-
|
|
88
|
-
<Box flexDirection="column" gap={1}>
|
|
89
|
-
<Box flexDirection="column">
|
|
90
|
-
<Text dimColor>Username</Text>
|
|
91
|
-
<TextInput
|
|
92
|
-
value={username}
|
|
93
|
-
onChange={setUsername}
|
|
94
|
-
placeholder="username"
|
|
95
|
-
focus={step === 'username' && !submitting}
|
|
96
|
-
/>
|
|
97
|
-
</Box>
|
|
98
|
-
|
|
99
|
-
<Box flexDirection="column">
|
|
100
|
-
<Text dimColor>Password</Text>
|
|
101
|
-
<TextInput
|
|
102
|
-
value={password}
|
|
103
|
-
onChange={setPassword}
|
|
104
|
-
mask="*"
|
|
105
|
-
placeholder={step === 'password' ? 'password' : 'Press Enter after username'}
|
|
106
|
-
focus={step === 'password' && !submitting}
|
|
107
|
-
showCursor={step === 'password'}
|
|
108
|
-
/>
|
|
109
|
-
</Box>
|
|
110
|
-
</Box>
|
|
111
|
-
|
|
112
|
-
{submitting && (
|
|
113
|
-
<Box>
|
|
114
|
-
<Text>
|
|
115
|
-
<Spinner type="dots" /> Authenticating…
|
|
116
|
-
</Text>
|
|
117
|
-
</Box>
|
|
118
|
-
)}
|
|
119
|
-
|
|
120
|
-
{error && (
|
|
121
|
-
<Box>
|
|
122
|
-
<Text color="red">{error}</Text>
|
|
123
|
-
</Box>
|
|
124
|
-
)}
|
|
125
|
-
</Box>
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import React, { useCallback, useState } from 'react';
|
|
2
|
-
import { getInk, getInkSelectInput, getInkTextInput } from '../inkModules';
|
|
3
|
-
import { useLayout } from '../Layout';
|
|
4
|
-
import type { ReviewMode } from '../../reviewPipeline';
|
|
5
|
-
|
|
6
|
-
interface ModeSelectionProps {
|
|
7
|
-
onSelect: (mode: ReviewMode, extras?: { targetUrl?: string }) => void;
|
|
8
|
-
debugEnabled: boolean;
|
|
9
|
-
onToggleDebug: () => void;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
interface ModeOption {
|
|
13
|
-
label: string;
|
|
14
|
-
value: ReviewMode;
|
|
15
|
-
description: string;
|
|
16
|
-
requiresUrl?: boolean;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const OPTIONS: ModeOption[] = [
|
|
20
|
-
{
|
|
21
|
-
label: 'Review uncommitted changes',
|
|
22
|
-
value: 'uncommitted',
|
|
23
|
-
description: 'Scan staged and unstaged changes only',
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
label: 'Pre-production review',
|
|
27
|
-
value: 'preprod',
|
|
28
|
-
description: 'Scan the entire workspace and trigger website checks',
|
|
29
|
-
requiresUrl: true,
|
|
30
|
-
},
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
export function ModeSelection({ onSelect, debugEnabled, onToggleDebug }: ModeSelectionProps) {
|
|
34
|
-
const { Box, Text, useInput } = getInk();
|
|
35
|
-
const SelectInput = getInkSelectInput();
|
|
36
|
-
const TextInput = getInkTextInput();
|
|
37
|
-
const { frameWidth } = useLayout();
|
|
38
|
-
const [phase, setPhase] = useState<'list' | 'preprodUrl'>('list');
|
|
39
|
-
const [pendingMode, setPendingMode] = useState<ReviewMode>('preprod');
|
|
40
|
-
const [highlighted, setHighlighted] = useState<ReviewMode>('uncommitted');
|
|
41
|
-
const [urlValue, setUrlValue] = useState('');
|
|
42
|
-
const [urlError, setUrlError] = useState<string | null>(null);
|
|
43
|
-
|
|
44
|
-
const resetUrlState = useCallback(() => {
|
|
45
|
-
setUrlValue('');
|
|
46
|
-
setUrlError(null);
|
|
47
|
-
}, []);
|
|
48
|
-
|
|
49
|
-
const handleModeSelect = useCallback(
|
|
50
|
-
(mode: ReviewMode) => {
|
|
51
|
-
const option = OPTIONS.find((opt) => opt.value === mode);
|
|
52
|
-
if (!option) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (option.requiresUrl) {
|
|
57
|
-
setPendingMode(option.value);
|
|
58
|
-
resetUrlState();
|
|
59
|
-
setPhase('preprodUrl');
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
onSelect(option.value);
|
|
64
|
-
},
|
|
65
|
-
[onSelect, resetUrlState],
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
const submitUrl = useCallback(() => {
|
|
69
|
-
if (phase !== 'preprodUrl') {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const trimmed = urlValue.trim();
|
|
74
|
-
if (!trimmed) {
|
|
75
|
-
setUrlError('URL is required');
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
try {
|
|
80
|
-
const parsed = new URL(trimmed);
|
|
81
|
-
if (!['http:', 'https:'].includes(parsed.protocol)) {
|
|
82
|
-
throw new Error('invalid');
|
|
83
|
-
}
|
|
84
|
-
setUrlError(null);
|
|
85
|
-
onSelect(pendingMode, { targetUrl: parsed.toString() });
|
|
86
|
-
} catch {
|
|
87
|
-
setUrlError('Enter a valid URL starting with http:// or https://');
|
|
88
|
-
}
|
|
89
|
-
}, [onSelect, pendingMode, phase, urlValue]);
|
|
90
|
-
|
|
91
|
-
useInput((input, key) => {
|
|
92
|
-
const normalizedInput = input.toLowerCase();
|
|
93
|
-
if (normalizedInput === 'd' && !key.ctrl && !key.meta) {
|
|
94
|
-
onToggleDebug();
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (phase !== 'preprodUrl') {
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (key.escape) {
|
|
103
|
-
setPhase('list');
|
|
104
|
-
resetUrlState();
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (key.return) {
|
|
109
|
-
submitUrl();
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
if (phase === 'preprodUrl') {
|
|
114
|
-
return (
|
|
115
|
-
<Box
|
|
116
|
-
width={frameWidth}
|
|
117
|
-
flexDirection="column"
|
|
118
|
-
borderStyle="round"
|
|
119
|
-
borderColor="cyan"
|
|
120
|
-
paddingX={2}
|
|
121
|
-
paddingY={1}
|
|
122
|
-
gap={1}
|
|
123
|
-
>
|
|
124
|
-
<Text color="cyan" bold>
|
|
125
|
-
Pre-production review
|
|
126
|
-
</Text>
|
|
127
|
-
<Text dimColor>Enter the full website URL. We will trigger ai.enki.si and scan every file here.</Text>
|
|
128
|
-
<Box flexDirection="column">
|
|
129
|
-
<Text dimColor>Target URL</Text>
|
|
130
|
-
<TextInput
|
|
131
|
-
value={urlValue}
|
|
132
|
-
onChange={(value) => {
|
|
133
|
-
setUrlValue(value);
|
|
134
|
-
if (urlError) {
|
|
135
|
-
setUrlError(null);
|
|
136
|
-
}
|
|
137
|
-
}}
|
|
138
|
-
placeholder="https://example.com"
|
|
139
|
-
focus
|
|
140
|
-
/>
|
|
141
|
-
</Box>
|
|
142
|
-
{urlError && (
|
|
143
|
-
<Text color="red">{urlError}</Text>
|
|
144
|
-
)}
|
|
145
|
-
<Box justifyContent="space-between">
|
|
146
|
-
<Text dimColor>Press Enter to start · Esc to go back</Text>
|
|
147
|
-
<Text dimColor>Debug: {debugEnabled ? 'On' : 'Off'} (press D)</Text>
|
|
148
|
-
</Box>
|
|
149
|
-
</Box>
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
return (
|
|
154
|
-
<Box
|
|
155
|
-
width={frameWidth}
|
|
156
|
-
flexDirection="column"
|
|
157
|
-
borderStyle="round"
|
|
158
|
-
borderColor="green"
|
|
159
|
-
paddingX={2}
|
|
160
|
-
paddingY={1}
|
|
161
|
-
gap={1}
|
|
162
|
-
>
|
|
163
|
-
<Box justifyContent="space-between" alignItems="center">
|
|
164
|
-
<Text color="green" bold>
|
|
165
|
-
Choose review mode
|
|
166
|
-
</Text>
|
|
167
|
-
<Text dimColor>Debug: {debugEnabled ? 'On' : 'Off'} (press D)</Text>
|
|
168
|
-
</Box>
|
|
169
|
-
<Text dimColor>Use arrow keys, press Enter to start.</Text>
|
|
170
|
-
<SelectInput
|
|
171
|
-
items={OPTIONS.map((option) => ({
|
|
172
|
-
label: option.label,
|
|
173
|
-
value: option.value,
|
|
174
|
-
}))}
|
|
175
|
-
onHighlight={(item) => setHighlighted(item.value as ReviewMode)}
|
|
176
|
-
onSelect={(item) => handleModeSelect(item.value as ReviewMode)}
|
|
177
|
-
/>
|
|
178
|
-
<Box flexDirection="column" marginTop={1}>
|
|
179
|
-
<Text dimColor>
|
|
180
|
-
· {OPTIONS.find((option) => option.value === highlighted)?.description}
|
|
181
|
-
</Text>
|
|
182
|
-
</Box>
|
|
183
|
-
</Box>
|
|
184
|
-
);
|
|
185
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import React, { useMemo } from 'react';
|
|
2
|
-
import { useLayout } from '../Layout';
|
|
3
|
-
import type { ReviewStage } from '../../reviewPipeline';
|
|
4
|
-
import { getInk, getInkSpinner } from '../inkModules';
|
|
5
|
-
|
|
6
|
-
interface ProgressScreenProps {
|
|
7
|
-
stage: ReviewStage;
|
|
8
|
-
filesFound?: number;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const STAGE_TEXT: Record<ReviewStage, { title: string; detail: string }> = {
|
|
12
|
-
preparing: {
|
|
13
|
-
title: 'Preparing run',
|
|
14
|
-
detail: 'Triggering website checks and configuring the reviewer',
|
|
15
|
-
},
|
|
16
|
-
collecting: {
|
|
17
|
-
title: 'Collecting files',
|
|
18
|
-
detail: 'Inspecting your working tree',
|
|
19
|
-
},
|
|
20
|
-
reviewing: {
|
|
21
|
-
title: 'Running AI review',
|
|
22
|
-
detail: 'Streaming code to the reviewer',
|
|
23
|
-
},
|
|
24
|
-
merging: {
|
|
25
|
-
title: 'Merging reports',
|
|
26
|
-
detail: 'Normalizing findings and cost data',
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export function ProgressScreen({ stage, filesFound }: ProgressScreenProps) {
|
|
31
|
-
const { Box, Text } = getInk();
|
|
32
|
-
const Spinner = getInkSpinner();
|
|
33
|
-
const { frameWidth } = useLayout();
|
|
34
|
-
|
|
35
|
-
const meta = useMemo(() => STAGE_TEXT[stage], [stage]);
|
|
36
|
-
const fileStatus =
|
|
37
|
-
stage === 'collecting' && typeof filesFound === 'number' && filesFound >= 0
|
|
38
|
-
? `${filesFound} files queued`
|
|
39
|
-
: stage === 'collecting'
|
|
40
|
-
? 'Preparing file list…'
|
|
41
|
-
: '';
|
|
42
|
-
|
|
43
|
-
return (
|
|
44
|
-
<Box
|
|
45
|
-
width={frameWidth}
|
|
46
|
-
flexDirection="column"
|
|
47
|
-
borderStyle="round"
|
|
48
|
-
borderColor="cyan"
|
|
49
|
-
paddingX={2}
|
|
50
|
-
paddingY={1}
|
|
51
|
-
gap={1}
|
|
52
|
-
>
|
|
53
|
-
<Box gap={1}>
|
|
54
|
-
<Text>
|
|
55
|
-
<Spinner type="line" /> {meta.title}
|
|
56
|
-
</Text>
|
|
57
|
-
</Box>
|
|
58
|
-
<Text dimColor>{meta.detail}</Text>
|
|
59
|
-
{fileStatus && <Text dimColor>{fileStatus}</Text>}
|
|
60
|
-
</Box>
|
|
61
|
-
);
|
|
62
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import React, { useMemo } from 'react';
|
|
2
|
-
import type { ReviewResult } from '../../reviewPipeline';
|
|
3
|
-
import { useLayout } from '../Layout';
|
|
4
|
-
import { getInk } from '../inkModules';
|
|
5
|
-
|
|
6
|
-
interface ResultsScreenProps {
|
|
7
|
-
result: ReviewResult;
|
|
8
|
-
debugLogPath?: string | null;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function ResultsScreen({ result, debugLogPath }: ResultsScreenProps) {
|
|
12
|
-
const { Box, Text } = getInk();
|
|
13
|
-
const { frameWidth } = useLayout();
|
|
14
|
-
|
|
15
|
-
const severityRows = useMemo(() => {
|
|
16
|
-
const totals = result.totals || { critical: 0, high: 0, medium: 0, low: 0 };
|
|
17
|
-
return [
|
|
18
|
-
{ label: 'Critical', value: totals.critical ?? 0 },
|
|
19
|
-
{ label: 'High', value: totals.high ?? 0 },
|
|
20
|
-
{ label: 'Medium', value: totals.medium ?? 0 },
|
|
21
|
-
{ label: 'Low', value: totals.low ?? 0 },
|
|
22
|
-
];
|
|
23
|
-
}, [result.totals]);
|
|
24
|
-
|
|
25
|
-
return (
|
|
26
|
-
<Box
|
|
27
|
-
width={frameWidth}
|
|
28
|
-
flexDirection="column"
|
|
29
|
-
borderStyle="round"
|
|
30
|
-
borderColor="green"
|
|
31
|
-
paddingX={2}
|
|
32
|
-
paddingY={1}
|
|
33
|
-
gap={1}
|
|
34
|
-
>
|
|
35
|
-
<Text color="green" bold>
|
|
36
|
-
Review complete for {result.repo}
|
|
37
|
-
</Text>
|
|
38
|
-
<Text dimColor>Duration: {result.duration}s — Files reviewed: {result.filesReviewed}</Text>
|
|
39
|
-
|
|
40
|
-
<Box flexDirection="column" marginTop={1}>
|
|
41
|
-
{severityRows.map((row) => (
|
|
42
|
-
<Box key={row.label}>
|
|
43
|
-
<Text>
|
|
44
|
-
{row.label}: {row.value}
|
|
45
|
-
</Text>
|
|
46
|
-
</Box>
|
|
47
|
-
))}
|
|
48
|
-
</Box>
|
|
49
|
-
|
|
50
|
-
{result.findings.length === 0 ? (
|
|
51
|
-
<Text dimColor>No findings reported.</Text>
|
|
52
|
-
) : (
|
|
53
|
-
<Box flexDirection="column" marginTop={1}>
|
|
54
|
-
<Text bold>Sample findings</Text>
|
|
55
|
-
{result.findings.slice(0, 5).map((finding, index) => (
|
|
56
|
-
<Text key={`${finding.filePath}-${index}`} dimColor>
|
|
57
|
-
· {finding.filePath ?? finding.file ?? 'unknown'} {finding.priority ? `(${finding.priority})` : ''}
|
|
58
|
-
</Text>
|
|
59
|
-
))}
|
|
60
|
-
{result.findings.length > 5 && (
|
|
61
|
-
<Text dimColor>…and {result.findings.length - 5} more in the saved report.</Text>
|
|
62
|
-
)}
|
|
63
|
-
</Box>
|
|
64
|
-
)}
|
|
65
|
-
|
|
66
|
-
{result.reportPath && (
|
|
67
|
-
<Box marginTop={1}>
|
|
68
|
-
<Text dimColor>Report saved to: {result.reportPath}</Text>
|
|
69
|
-
</Box>
|
|
70
|
-
)}
|
|
71
|
-
|
|
72
|
-
{debugLogPath && (
|
|
73
|
-
<Box marginTop={1}>
|
|
74
|
-
<Text dimColor>Debug logs saved to: {debugLogPath}</Text>
|
|
75
|
-
</Box>
|
|
76
|
-
)}
|
|
77
|
-
|
|
78
|
-
<Box marginTop={1}>
|
|
79
|
-
<Text dimColor>Press Enter to return to mode selection.</Text>
|
|
80
|
-
</Box>
|
|
81
|
-
</Box>
|
|
82
|
-
);
|
|
83
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Architectural review strategy implementation.
|
|
3
|
-
*
|
|
4
|
-
* This module implements the architectural review strategy, which analyzes the entire
|
|
5
|
-
* codebase structure and design patterns to provide high-level feedback.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { ApiClientConfig } from '../core/ApiClientSelector';
|
|
9
|
-
import { generateReview } from '../core/ReviewGenerator';
|
|
10
|
-
import type { FileInfo, ReviewOptions, ReviewResult /* , ReviewType */ } from '../types/review'; // ReviewType not used
|
|
11
|
-
import logger from '../utils/logger';
|
|
12
|
-
import type { ProjectDocs } from '../utils/projectDocs';
|
|
13
|
-
import { BaseReviewStrategy } from './ReviewStrategy';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Strategy for architectural reviews
|
|
17
|
-
*/
|
|
18
|
-
export class ArchitecturalReviewStrategy extends BaseReviewStrategy {
|
|
19
|
-
/**
|
|
20
|
-
* Create a new architectural review strategy
|
|
21
|
-
*/
|
|
22
|
-
constructor() {
|
|
23
|
-
super('architectural');
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Execute the architectural review strategy
|
|
28
|
-
* @param files Files to review
|
|
29
|
-
* @param projectName Project name
|
|
30
|
-
* @param projectDocs Project documentation
|
|
31
|
-
* @param options Review options
|
|
32
|
-
* @param apiClientConfig API client configuration
|
|
33
|
-
* @returns Promise resolving to the review result
|
|
34
|
-
*/
|
|
35
|
-
async execute(
|
|
36
|
-
files: FileInfo[],
|
|
37
|
-
projectName: string,
|
|
38
|
-
projectDocs: ProjectDocs | null,
|
|
39
|
-
options: ReviewOptions,
|
|
40
|
-
apiClientConfig: ApiClientConfig,
|
|
41
|
-
): Promise<ReviewResult> {
|
|
42
|
-
logger.info('Executing architectural review strategy...');
|
|
43
|
-
|
|
44
|
-
// Generate the review using the selected API client
|
|
45
|
-
return generateReview(
|
|
46
|
-
files,
|
|
47
|
-
projectName,
|
|
48
|
-
this.reviewType,
|
|
49
|
-
projectDocs,
|
|
50
|
-
options,
|
|
51
|
-
apiClientConfig,
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
}
|