vantaverse-ai-reviewer 0.1.5 โ 0.2.1
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 +55 -15
- package/dist/ai/agent.d.ts +1 -1
- package/dist/ai/agent.d.ts.map +1 -1
- package/dist/ai/agent.js +23 -11
- package/dist/ai/agent.js.map +1 -1
- package/dist/commands/scan.d.ts +7 -2
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +209 -27
- package/dist/commands/scan.js.map +1 -1
- package/dist/core/diff-analyzer.d.ts +22 -0
- package/dist/core/diff-analyzer.d.ts.map +1 -0
- package/dist/core/diff-analyzer.js +71 -0
- package/dist/core/diff-analyzer.js.map +1 -0
- package/dist/core/framework-detector.d.ts.map +1 -1
- package/dist/core/framework-detector.js +48 -17
- package/dist/core/framework-detector.js.map +1 -1
- package/dist/core/security-scanner.d.ts +36 -0
- package/dist/core/security-scanner.d.ts.map +1 -0
- package/dist/core/security-scanner.js +130 -0
- package/dist/core/security-scanner.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/interactive-logger.d.ts +49 -0
- package/dist/utils/interactive-logger.d.ts.map +1 -0
- package/dist/utils/interactive-logger.js +190 -0
- package/dist/utils/interactive-logger.js.map +1 -0
- package/dist/utils/token-estimator.d.ts +26 -0
- package/dist/utils/token-estimator.d.ts.map +1 -0
- package/dist/utils/token-estimator.js +92 -0
- package/dist/utils/token-estimator.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,6 +11,13 @@
|
|
|
11
11
|
- ๐งช **Test Suggestions** - Recommends test cases
|
|
12
12
|
- ๐ **Detailed Reports** - Markdown reports with actionable insights
|
|
13
13
|
|
|
14
|
+
### ๐ v0.2.0 - Performance Optimizations
|
|
15
|
+
|
|
16
|
+
- โก **50% faster** - Parallel local checks (TSC, ESLint, git)
|
|
17
|
+
- ๐ฐ **80% cost reduction** - `--diff` mode analyzes only changed files
|
|
18
|
+
- ๐ **Free security scans** - Regex secret detection + npm audit (zero tokens)
|
|
19
|
+
- ๐ **Cost estimation** - Know your token usage before scanning
|
|
20
|
+
|
|
14
21
|
## Quick Start
|
|
15
22
|
|
|
16
23
|
```bash
|
|
@@ -27,20 +34,51 @@ Get one free at: https://aistudio.google.com/apikey
|
|
|
27
34
|
|
|
28
35
|
## Usage
|
|
29
36
|
|
|
30
|
-
###
|
|
37
|
+
### Basic Scan
|
|
31
38
|
|
|
32
39
|
```bash
|
|
33
|
-
#
|
|
40
|
+
# Analyze current directory
|
|
34
41
|
vantaverse-ai-reviewer scan
|
|
35
42
|
|
|
36
|
-
# With
|
|
37
|
-
vantaverse-ai-reviewer scan --
|
|
43
|
+
# With verbose output
|
|
44
|
+
vantaverse-ai-reviewer scan --verbose
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### ๐ Diff Mode (Recommended for Daily Use)
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# Only analyze changed files - saves ~80% tokens!
|
|
51
|
+
vantaverse-ai-reviewer scan --diff
|
|
52
|
+
|
|
53
|
+
# Compare against specific branch
|
|
54
|
+
vantaverse-ai-reviewer scan --diff --base develop
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Budget Control
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Set max cost limit (prompts if exceeded)
|
|
61
|
+
vantaverse-ai-reviewer scan --budget 0.10
|
|
62
|
+
|
|
63
|
+
# See token estimate with verbose
|
|
64
|
+
vantaverse-ai-reviewer scan --verbose
|
|
65
|
+
```
|
|
38
66
|
|
|
39
|
-
|
|
40
|
-
vantaverse-ai-reviewer scan --json
|
|
67
|
+
### All Options
|
|
41
68
|
|
|
42
|
-
|
|
43
|
-
vantaverse-ai-reviewer scan
|
|
69
|
+
```bash
|
|
70
|
+
vantaverse-ai-reviewer scan [options]
|
|
71
|
+
|
|
72
|
+
Options:
|
|
73
|
+
-o, --output <file> Output report filename (default: AI_REVIEW_REPORT.md)
|
|
74
|
+
-j, --json Also generate JSON report
|
|
75
|
+
-t, --types <types> Analysis types: overview,security,codeQuality,accessibility,uiux,testing
|
|
76
|
+
-v, --verbose Show detailed output with token estimates
|
|
77
|
+
-d, --diff Only analyze changed files (uses git diff)
|
|
78
|
+
-b, --base <branch> Base branch for diff (default: main)
|
|
79
|
+
--budget <usd> Maximum cost budget in USD
|
|
80
|
+
--full Force full scan (override --diff)
|
|
81
|
+
--no-security Skip free security checks
|
|
44
82
|
```
|
|
45
83
|
|
|
46
84
|
### Manage Configuration
|
|
@@ -67,14 +105,16 @@ vantaverse-ai-reviewer config --action reset
|
|
|
67
105
|
| `uiux` | User experience issues, loading states |
|
|
68
106
|
| `testing` | Suggested test cases and coverage |
|
|
69
107
|
|
|
70
|
-
##
|
|
108
|
+
## ๐ Free Security Checks (Zero Cost)
|
|
109
|
+
|
|
110
|
+
Before using tokens, the CLI runs free local security scans:
|
|
111
|
+
|
|
112
|
+
1. **Secret Detection** - Regex patterns for:
|
|
113
|
+
- AWS keys, GitHub tokens, Stripe keys
|
|
114
|
+
- JWTs, private keys, database URLs
|
|
115
|
+
- Generic API keys and secrets
|
|
71
116
|
|
|
72
|
-
|
|
73
|
-
- Project information and framework detection
|
|
74
|
-
- Security analysis findings
|
|
75
|
-
- Code quality review
|
|
76
|
-
- Accessibility audit results
|
|
77
|
-
- Suggested improvements
|
|
117
|
+
2. **npm Audit** - Checks for known vulnerabilities
|
|
78
118
|
|
|
79
119
|
## Security
|
|
80
120
|
|
package/dist/ai/agent.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export declare class AIAgent {
|
|
|
37
37
|
/**
|
|
38
38
|
* Run the full analysis pipeline
|
|
39
39
|
*/
|
|
40
|
-
analyze(scanResult: ScanResult): Promise<AgentResult>;
|
|
40
|
+
analyze(scanResult: ScanResult, onProgress?: (stage: string, detail?: string) => void): Promise<AgentResult>;
|
|
41
41
|
/**
|
|
42
42
|
* Run a single analysis type
|
|
43
43
|
*/
|
package/dist/ai/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/ai/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAIlF,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,aAAa,CAAC;IACzB,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAWD;;GAEG;AACH,qBAAa,OAAO;IAChB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW;IAKrD;;OAEG;IACG,OAAO,
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/ai/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAIlF,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,aAAa,CAAC;IACzB,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAWD;;GAEG;AACH,qBAAa,OAAO;IAChB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW;IAKrD;;OAEG;IACG,OAAO,CACT,UAAU,EAAE,UAAU,EACtB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,GACtD,OAAO,CAAC,WAAW,CAAC;IAsDvB;;OAEG;YACW,WAAW;IAoDzB;;OAEG;IACH,OAAO,CAAC,0BAA0B;CAgCrC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,WAAW,CAAC,GAAG,OAAO,CASrI"}
|
package/dist/ai/agent.js
CHANGED
|
@@ -25,32 +25,40 @@ export class AIAgent {
|
|
|
25
25
|
/**
|
|
26
26
|
* Run the full analysis pipeline
|
|
27
27
|
*/
|
|
28
|
-
async analyze(scanResult) {
|
|
28
|
+
async analyze(scanResult, onProgress) {
|
|
29
29
|
const startTime = Date.now();
|
|
30
30
|
const sections = [];
|
|
31
31
|
let totalTokens = 0;
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
// PHASE 1 OPTIMIZATION: Run local checks in parallel
|
|
33
|
+
onProgress?.('local', 'โก Running local checks in parallel...');
|
|
34
|
+
const [context, typeErrors, lintIssues] = await Promise.all([
|
|
35
|
+
gatherRepoContext(this.config.repoRoot),
|
|
36
|
+
runTypeCheck(this.config.repoRoot),
|
|
37
|
+
runLint(this.config.repoRoot)
|
|
38
|
+
]);
|
|
39
|
+
// Add check results to context
|
|
36
40
|
if (typeErrors.length > 0) {
|
|
37
41
|
context['type_errors'] = `${typeErrors.length} TypeScript errors found`;
|
|
42
|
+
onProgress?.('local', `โ ๏ธ Found ${typeErrors.length} TypeScript errors`);
|
|
38
43
|
}
|
|
39
|
-
// Run linting
|
|
40
|
-
const lintIssues = await runLint(this.config.repoRoot);
|
|
41
44
|
if (lintIssues.length > 0) {
|
|
42
45
|
context['lint_issues'] = `${lintIssues.length} lint issues found`;
|
|
46
|
+
onProgress?.('local', `โ ๏ธ Found ${lintIssues.length} lint issues`);
|
|
43
47
|
}
|
|
44
48
|
// Determine which files to analyze for each type
|
|
45
49
|
const filesByType = this.categorizeFilesForAnalysis(scanResult);
|
|
46
|
-
// Run each analysis type
|
|
50
|
+
// Run each analysis type with progress updates
|
|
47
51
|
for (const analysisType of this.config.analysisTypes) {
|
|
48
52
|
const files = filesByType[analysisType] || scanResult.files.slice(0, 20);
|
|
49
53
|
if (files.length === 0)
|
|
50
54
|
continue;
|
|
51
|
-
|
|
55
|
+
// Report start of this analysis phase
|
|
56
|
+
onProgress?.(analysisType, `๐ Analyzing ${files.length} files...`);
|
|
57
|
+
const section = await this.runAnalysis(analysisType, files, context, onProgress);
|
|
52
58
|
sections.push(section);
|
|
53
59
|
totalTokens += section.tokensUsed;
|
|
60
|
+
// Report completion
|
|
61
|
+
onProgress?.(analysisType, `โ
${SECTION_TITLES[analysisType]} complete`);
|
|
54
62
|
}
|
|
55
63
|
return {
|
|
56
64
|
sections,
|
|
@@ -64,14 +72,16 @@ export class AIAgent {
|
|
|
64
72
|
/**
|
|
65
73
|
* Run a single analysis type
|
|
66
74
|
*/
|
|
67
|
-
async runAnalysis(type, files, context) {
|
|
68
|
-
// Read file contents
|
|
75
|
+
async runAnalysis(type, files, context, onProgress) {
|
|
76
|
+
// Read file contents with progress updates
|
|
69
77
|
const fileContents = new Map();
|
|
70
78
|
let totalChars = 0;
|
|
71
79
|
for (const file of files) {
|
|
72
80
|
if (totalChars >= this.config.maxCharsPerBatch)
|
|
73
81
|
break;
|
|
74
82
|
try {
|
|
83
|
+
// Report file being read
|
|
84
|
+
onProgress?.(type, `๐ Reading ${file.relativePath}...`);
|
|
75
85
|
const content = await safeReadFile(file.path, this.config.repoRoot, 100 * 1024 // 100KB max per file
|
|
76
86
|
);
|
|
77
87
|
if (totalChars + content.length <= this.config.maxCharsPerBatch) {
|
|
@@ -87,6 +97,8 @@ export class AIAgent {
|
|
|
87
97
|
const basePrompt = getPrompt(type);
|
|
88
98
|
const frameworkHints = this.config.framework.description;
|
|
89
99
|
const prompt = createContextualPrompt(basePrompt, frameworkHints, context);
|
|
100
|
+
// Report AI thinking
|
|
101
|
+
onProgress?.(type, `๐ค AI is analyzing ${fileContents.size} files...`);
|
|
90
102
|
// Run analysis
|
|
91
103
|
const result = await this.client.analyzeMultiple(prompt, fileContents, '');
|
|
92
104
|
return {
|
package/dist/ai/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/ai/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAmB,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AA2B/E,MAAM,cAAc,GAA+B;IAC/C,QAAQ,EAAE,sBAAsB;IAChC,WAAW,EAAE,wBAAwB;IACrC,aAAa,EAAE,uBAAuB;IACtC,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,4BAA4B;IACrC,QAAQ,EAAE,qBAAqB;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,OAAO;IACR,MAAM,CAAe;IACrB,MAAM,CAAc;IAE5B,YAAY,MAAoB,EAAE,MAAmB;QACjD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/ai/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/scan.d.ts
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Scan Command - Main analysis command
|
|
2
|
+
* Scan Command - Main analysis command with interactive CLI
|
|
3
3
|
*/
|
|
4
4
|
export interface ScanOptions {
|
|
5
5
|
output?: string;
|
|
6
6
|
json?: boolean;
|
|
7
7
|
types?: string;
|
|
8
8
|
verbose?: boolean;
|
|
9
|
+
diff?: boolean;
|
|
10
|
+
base?: string;
|
|
11
|
+
budget?: number;
|
|
12
|
+
full?: boolean;
|
|
13
|
+
security?: boolean;
|
|
9
14
|
}
|
|
10
15
|
/**
|
|
11
|
-
* Execute the scan command
|
|
16
|
+
* Execute the scan command with interactive CLI
|
|
12
17
|
*/
|
|
13
18
|
export declare function scan(options?: ScanOptions): Promise<void>;
|
|
14
19
|
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,MAAM,WAAW,WAAW;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAuBD;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmSnE"}
|
package/dist/commands/scan.js
CHANGED
|
@@ -1,17 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Scan Command - Main analysis command
|
|
2
|
+
* Scan Command - Main analysis command with interactive CLI
|
|
3
3
|
*/
|
|
4
4
|
import path from 'path';
|
|
5
|
+
import chalk from 'chalk';
|
|
5
6
|
import * as logger from '../utils/logger.js';
|
|
6
7
|
import { ensureToken, getToken } from '../auth/token-manager.js';
|
|
7
8
|
import { detectFramework, getFrameworkHints } from '../core/framework-detector.js';
|
|
8
|
-
import { scanRepository
|
|
9
|
+
import { scanRepository } from '../core/scanner.js';
|
|
9
10
|
import { createGeminiClient } from '../ai/gemini-client.js';
|
|
10
11
|
import { createAgent } from '../ai/agent.js';
|
|
11
12
|
import { generateMarkdownReport, writeReport, generateJsonReport } from '../reporters/markdown.js';
|
|
13
|
+
import { getChangedFiles, getRelatedFiles } from '../core/diff-analyzer.js';
|
|
14
|
+
import { runSecurityScan } from '../core/security-scanner.js';
|
|
15
|
+
import { estimateScanCost, formatEstimate } from '../utils/token-estimator.js';
|
|
12
16
|
import fs from 'fs';
|
|
17
|
+
import inquirer from 'inquirer';
|
|
18
|
+
// Phase icons for display
|
|
19
|
+
const PHASE_ICONS = {
|
|
20
|
+
local: 'โก',
|
|
21
|
+
overview: '๐',
|
|
22
|
+
security: '๐',
|
|
23
|
+
codeQuality: '๐งน',
|
|
24
|
+
accessibility: 'โฟ',
|
|
25
|
+
uiux: '๐จ',
|
|
26
|
+
testing: '๐งช'
|
|
27
|
+
};
|
|
28
|
+
// Agentic thinking messages
|
|
29
|
+
const THINKING_MESSAGES = [
|
|
30
|
+
'๐ค AI is thinking deeply...',
|
|
31
|
+
'๐ง Processing code patterns...',
|
|
32
|
+
'๐ญ Formulating insights...',
|
|
33
|
+
'๐ฎ Generating recommendations...',
|
|
34
|
+
'โจ Almost there...',
|
|
35
|
+
'๐ฏ Focusing on key issues...'
|
|
36
|
+
];
|
|
13
37
|
/**
|
|
14
|
-
* Execute the scan command
|
|
38
|
+
* Execute the scan command with interactive CLI
|
|
15
39
|
*/
|
|
16
40
|
export async function scan(options = {}) {
|
|
17
41
|
const repoRoot = process.cwd();
|
|
@@ -20,7 +44,6 @@ export async function scan(options = {}) {
|
|
|
20
44
|
const existingToken = getToken();
|
|
21
45
|
let token;
|
|
22
46
|
if (!existingToken) {
|
|
23
|
-
// No spinner when prompting for token
|
|
24
47
|
token = await ensureToken();
|
|
25
48
|
}
|
|
26
49
|
else {
|
|
@@ -30,7 +53,7 @@ export async function scan(options = {}) {
|
|
|
30
53
|
const spin = logger.spinner('Validating API access...');
|
|
31
54
|
spin.start();
|
|
32
55
|
try {
|
|
33
|
-
// Validate token
|
|
56
|
+
// Validate token
|
|
34
57
|
const client = createGeminiClient(token);
|
|
35
58
|
const validation = await client.validateKey();
|
|
36
59
|
if (!validation.valid) {
|
|
@@ -45,19 +68,64 @@ export async function scan(options = {}) {
|
|
|
45
68
|
}
|
|
46
69
|
spin.succeed('API access validated');
|
|
47
70
|
// Detect framework
|
|
48
|
-
spin.start('Detecting project framework...');
|
|
71
|
+
spin.start('๐ Detecting project framework...');
|
|
49
72
|
const framework = await detectFramework(repoRoot);
|
|
50
|
-
spin.succeed(`Detected: ${framework.displayName}`);
|
|
73
|
+
spin.succeed(`Detected: ${chalk.cyan(framework.displayName)}`);
|
|
51
74
|
if (options.verbose) {
|
|
52
75
|
logger.info(`Framework hints: ${getFrameworkHints(framework.name)}`);
|
|
53
76
|
}
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
77
|
+
// Diff-based or full scanning
|
|
78
|
+
let scanResult;
|
|
79
|
+
let diffMode = false;
|
|
80
|
+
if (options.diff && !options.full) {
|
|
81
|
+
spin.start('๐ Analyzing git changes...');
|
|
82
|
+
const diffResult = await getChangedFiles(repoRoot, options.base || 'main');
|
|
83
|
+
if (diffResult.hasChanges) {
|
|
84
|
+
diffMode = true;
|
|
85
|
+
spin.succeed(`Diff mode: ${chalk.green(diffResult.summary)}`);
|
|
86
|
+
const relatedFiles = await getRelatedFiles(repoRoot, diffResult.changedFiles);
|
|
87
|
+
const allRelevantFiles = [...new Set([...diffResult.changedFiles, ...relatedFiles])];
|
|
88
|
+
if (options.verbose) {
|
|
89
|
+
logger.info(`Changed: ${diffResult.changedFiles.length}, Related: ${relatedFiles.length}`);
|
|
90
|
+
}
|
|
91
|
+
spin.start('๐ Scanning changed files...');
|
|
92
|
+
const fullScan = await scanRepository(repoRoot, framework);
|
|
93
|
+
scanResult = {
|
|
94
|
+
...fullScan,
|
|
95
|
+
files: fullScan.files.filter(f => allRelevantFiles.some(cf => f.relativePath.endsWith(cf) || cf.endsWith(f.relativePath)))
|
|
96
|
+
};
|
|
97
|
+
scanResult.byCategory = {
|
|
98
|
+
component: [], page: [], api: [], utility: [],
|
|
99
|
+
config: [], test: [], style: [], type: [], other: []
|
|
100
|
+
};
|
|
101
|
+
for (const file of scanResult.files) {
|
|
102
|
+
scanResult.byCategory[file.category].push(file);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
spin.info('No changes detected, running full scan');
|
|
107
|
+
scanResult = await scanRepository(repoRoot, framework);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
spin.start('๐ Scanning repository...');
|
|
112
|
+
scanResult = await scanRepository(repoRoot, framework);
|
|
113
|
+
}
|
|
114
|
+
spin.succeed(`Found ${chalk.cyan(scanResult.files.length)} files${diffMode ? chalk.gray(' (diff mode)') : ''}`);
|
|
115
|
+
// Show scanned files in verbose mode
|
|
58
116
|
if (options.verbose) {
|
|
59
117
|
console.log();
|
|
60
|
-
console.log(
|
|
118
|
+
console.log(chalk.gray(' Scanned files:'));
|
|
119
|
+
const displayFiles = scanResult.files.slice(0, 15);
|
|
120
|
+
for (const file of displayFiles) {
|
|
121
|
+
const ext = file.extension || 'file';
|
|
122
|
+
const icon = getFileIcon(ext);
|
|
123
|
+
console.log(` ${icon} ${chalk.gray(file.relativePath)} ${chalk.green('[scanned]')}`);
|
|
124
|
+
}
|
|
125
|
+
if (scanResult.files.length > 15) {
|
|
126
|
+
console.log(chalk.gray(` ... and ${scanResult.files.length - 15} more files`));
|
|
127
|
+
}
|
|
128
|
+
console.log();
|
|
61
129
|
}
|
|
62
130
|
if (scanResult.files.length === 0) {
|
|
63
131
|
logger.warn('No files found to analyze. Check your project structure.');
|
|
@@ -67,18 +135,108 @@ export async function scan(options = {}) {
|
|
|
67
135
|
const analysisTypes = options.types
|
|
68
136
|
? options.types.split(',')
|
|
69
137
|
: ['overview', 'security', 'codeQuality', 'accessibility'];
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
|
|
138
|
+
// Token estimation
|
|
139
|
+
const estimate = estimateScanCost(scanResult.files, analysisTypes);
|
|
140
|
+
if (options.verbose) {
|
|
141
|
+
console.log(formatEstimate(estimate));
|
|
142
|
+
console.log();
|
|
143
|
+
}
|
|
144
|
+
// Budget check
|
|
145
|
+
if (options.budget && estimate.estimatedCost > options.budget) {
|
|
146
|
+
logger.warn(`Estimated cost ($${estimate.estimatedCost.toFixed(4)}) exceeds budget ($${options.budget.toFixed(2)})`);
|
|
147
|
+
const { proceed } = await inquirer.prompt([
|
|
148
|
+
{
|
|
149
|
+
type: 'confirm',
|
|
150
|
+
name: 'proceed',
|
|
151
|
+
message: 'Do you want to proceed anyway?',
|
|
152
|
+
default: false
|
|
153
|
+
}
|
|
154
|
+
]);
|
|
155
|
+
if (!proceed) {
|
|
156
|
+
logger.info('Scan cancelled. Try using --diff mode to reduce cost.');
|
|
157
|
+
process.exit(0);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Free security scanning
|
|
161
|
+
if (options.security !== false) {
|
|
162
|
+
spin.start('๐ Running free security checks...');
|
|
163
|
+
const securityScan = await runSecurityScan(scanResult.files, repoRoot);
|
|
164
|
+
if (securityScan.hasIssues) {
|
|
165
|
+
spin.warn('Security issues found');
|
|
166
|
+
console.log();
|
|
167
|
+
if (securityScan.secrets.length > 0) {
|
|
168
|
+
logger.error(`๐ด ${securityScan.secrets.length} potential secrets detected:`);
|
|
169
|
+
for (const secret of securityScan.secrets.slice(0, 5)) {
|
|
170
|
+
console.log(` ${secret.file}:${secret.line} - ${secret.type} (${secret.severity})`);
|
|
171
|
+
}
|
|
172
|
+
if (securityScan.secrets.length > 5) {
|
|
173
|
+
console.log(` ... and ${securityScan.secrets.length - 5} more`);
|
|
174
|
+
}
|
|
175
|
+
console.log();
|
|
176
|
+
}
|
|
177
|
+
if (securityScan.vulnerabilities.length > 0) {
|
|
178
|
+
const critical = securityScan.vulnerabilities.filter(v => v.severity === 'critical' || v.severity === 'high');
|
|
179
|
+
if (critical.length > 0) {
|
|
180
|
+
logger.warn(`โ ๏ธ ${critical.length} critical/high npm vulnerabilities:`);
|
|
181
|
+
for (const vuln of critical.slice(0, 5)) {
|
|
182
|
+
console.log(` ${vuln.name}: ${vuln.description} (${vuln.severity})`);
|
|
183
|
+
}
|
|
184
|
+
console.log();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
spin.succeed('No secrets or critical vulnerabilities detected');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Run AI analysis with interactive progress
|
|
193
|
+
console.log();
|
|
194
|
+
logger.header('๐ค Running AI Analysis');
|
|
195
|
+
console.log(chalk.gray(` Analysis types: ${analysisTypes.join(', ')}`));
|
|
196
|
+
if (diffMode) {
|
|
197
|
+
console.log(chalk.gray(` Mode: Diff-based (${scanResult.files.length} files)`));
|
|
198
|
+
}
|
|
73
199
|
console.log();
|
|
74
|
-
|
|
200
|
+
// Create agentic progress display
|
|
201
|
+
let currentPhase = '';
|
|
202
|
+
let thinkingIndex = 0;
|
|
203
|
+
let thinkingInterval = null;
|
|
204
|
+
const agentSpin = logger.spinner('Starting analysis...');
|
|
205
|
+
agentSpin.start();
|
|
75
206
|
const agent = createAgent(client, {
|
|
76
207
|
repoRoot,
|
|
77
208
|
framework,
|
|
78
209
|
analysisTypes
|
|
79
210
|
});
|
|
80
|
-
const result = await agent.analyze(scanResult)
|
|
81
|
-
|
|
211
|
+
const result = await agent.analyze(scanResult, (phase, detail) => {
|
|
212
|
+
const icon = PHASE_ICONS[phase] || '๐';
|
|
213
|
+
if (phase !== currentPhase) {
|
|
214
|
+
currentPhase = phase;
|
|
215
|
+
// Show phase transition
|
|
216
|
+
if (thinkingInterval) {
|
|
217
|
+
clearInterval(thinkingInterval);
|
|
218
|
+
thinkingInterval = null;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (detail) {
|
|
222
|
+
// Check if this is an AI thinking phase
|
|
223
|
+
if (detail.includes('AI is analyzing')) {
|
|
224
|
+
// Start rotating thinking messages
|
|
225
|
+
thinkingIndex = 0;
|
|
226
|
+
thinkingInterval = setInterval(() => {
|
|
227
|
+
agentSpin.text = `${icon} ${THINKING_MESSAGES[thinkingIndex % THINKING_MESSAGES.length]}`;
|
|
228
|
+
thinkingIndex++;
|
|
229
|
+
}, 1500);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
agentSpin.text = `${icon} ${detail}`;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
if (thinkingInterval) {
|
|
237
|
+
clearInterval(thinkingInterval);
|
|
238
|
+
}
|
|
239
|
+
agentSpin.succeed(`Analysis complete in ${chalk.cyan((result.duration / 1000).toFixed(1) + 's')}`);
|
|
82
240
|
// Generate report
|
|
83
241
|
const outputFile = options.output || 'AI_REVIEW_REPORT.md';
|
|
84
242
|
const metadata = {
|
|
@@ -96,16 +254,20 @@ export async function scan(options = {}) {
|
|
|
96
254
|
const markdownReport = generateMarkdownReport(result, metadata);
|
|
97
255
|
const reportPath = await writeReport(markdownReport, outputFile);
|
|
98
256
|
logger.success(`Report generated: ${outputFile}`);
|
|
99
|
-
// Summary
|
|
257
|
+
// Summary box
|
|
100
258
|
console.log();
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
108
|
-
|
|
259
|
+
console.log(chalk.cyan(' โ' + 'โ'.repeat(50) + 'โ'));
|
|
260
|
+
console.log(chalk.cyan(' โ') + chalk.white.bold(' ๐ Analysis Summary'.padEnd(50)) + chalk.cyan('โ'));
|
|
261
|
+
console.log(chalk.cyan(' โ' + 'โ'.repeat(50) + 'โค'));
|
|
262
|
+
console.log(chalk.cyan(' โ') + ` Files Analyzed: ${chalk.green(scanResult.files.length)}`.padEnd(59) + chalk.cyan('โ'));
|
|
263
|
+
console.log(chalk.cyan(' โ') + ` Tokens Used: ${chalk.yellow(result.totalTokens.toLocaleString())}`.padEnd(59) + chalk.cyan('โ'));
|
|
264
|
+
console.log(chalk.cyan(' โ') + ` Est. Cost: ${chalk.gray('$' + estimate.estimatedCost.toFixed(4))}`.padEnd(59) + chalk.cyan('โ'));
|
|
265
|
+
console.log(chalk.cyan(' โ') + ` Duration: ${chalk.cyan((result.duration / 1000).toFixed(1) + 's')}`.padEnd(59) + chalk.cyan('โ'));
|
|
266
|
+
console.log(chalk.cyan(' โ') + ` Report: ${chalk.green(reportPath)}`.padEnd(59) + chalk.cyan('โ'));
|
|
267
|
+
if (diffMode) {
|
|
268
|
+
console.log(chalk.cyan(' โ') + ` Mode: ${chalk.magenta('Diff-based (optimized)')}`.padEnd(59) + chalk.cyan('โ'));
|
|
269
|
+
}
|
|
270
|
+
console.log(chalk.cyan(' โ' + 'โ'.repeat(50) + 'โ'));
|
|
109
271
|
console.log();
|
|
110
272
|
logger.success('Analysis complete! ๐');
|
|
111
273
|
}
|
|
@@ -118,4 +280,24 @@ export async function scan(options = {}) {
|
|
|
118
280
|
process.exit(1);
|
|
119
281
|
}
|
|
120
282
|
}
|
|
283
|
+
/**
|
|
284
|
+
* Get icon for file extension
|
|
285
|
+
*/
|
|
286
|
+
function getFileIcon(ext) {
|
|
287
|
+
const icons = {
|
|
288
|
+
'ts': '๐',
|
|
289
|
+
'tsx': 'โ๏ธ',
|
|
290
|
+
'js': '๐',
|
|
291
|
+
'jsx': 'โ๏ธ',
|
|
292
|
+
'py': '๐',
|
|
293
|
+
'vue': '๐',
|
|
294
|
+
'svelte': '๐งก',
|
|
295
|
+
'css': '๐จ',
|
|
296
|
+
'scss': '๐จ',
|
|
297
|
+
'html': '๐',
|
|
298
|
+
'json': '๐',
|
|
299
|
+
'md': '๐'
|
|
300
|
+
};
|
|
301
|
+
return icons[ext] || '๐';
|
|
302
|
+
}
|
|
121
303
|
//# sourceMappingURL=scan.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff Analyzer - Git-based change detection for token optimization
|
|
3
|
+
*/
|
|
4
|
+
export interface DiffResult {
|
|
5
|
+
changedFiles: string[];
|
|
6
|
+
baseBranch: string;
|
|
7
|
+
hasChanges: boolean;
|
|
8
|
+
summary: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get list of changed files compared to a base branch
|
|
12
|
+
*/
|
|
13
|
+
export declare function getChangedFiles(repoRoot: string, baseBranch?: string): Promise<DiffResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Get files that import/depend on changed files
|
|
16
|
+
*/
|
|
17
|
+
export declare function getRelatedFiles(repoRoot: string, changedFiles: string[]): Promise<string[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Get the actual diff content for a file
|
|
20
|
+
*/
|
|
21
|
+
export declare function getFileDiff(repoRoot: string, filePath: string, baseBranch?: string): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=diff-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-analyzer.d.ts","sourceRoot":"","sources":["../../src/core/diff-analyzer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,UAAU;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACjC,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,MAAe,GAC5B,OAAO,CAAC,UAAU,CAAC,CA6DrB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACjC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,MAAe,GAC5B,OAAO,CAAC,MAAM,CAAC,CAQjB"}
|