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 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
- ### Analyze Current Directory
37
+ ### Basic Scan
31
38
 
32
39
  ```bash
33
- # Basic scan
40
+ # Analyze current directory
34
41
  vantaverse-ai-reviewer scan
35
42
 
36
- # With options
37
- vantaverse-ai-reviewer scan --output custom-report.md --verbose
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
- # Include JSON output
40
- vantaverse-ai-reviewer scan --json
67
+ ### All Options
41
68
 
42
- # Select specific analysis types
43
- vantaverse-ai-reviewer scan --types security,codeQuality
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
- ## Output
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
- Generates `AI_REVIEW_REPORT.md` in your project root with:
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
 
@@ -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
  */
@@ -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,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA4C3D;;OAEG;YACW,WAAW;IA6CzB;;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"}
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
- // Gather repository context using dynamic commands
33
- const context = await gatherRepoContext(this.config.repoRoot);
34
- // Run type checking if TypeScript project
35
- const typeErrors = await runTypeCheck(this.config.repoRoot);
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
- const section = await this.runAnalysis(analysisType, files, context);
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 {
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/ai/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/ai/agent.ts"],"names":[],"mappings":"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"}
@@ -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;AAaH,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;CACrB;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmInE"}
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"}
@@ -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, getScanSummary } from '../core/scanner.js';
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 with a quick check
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
- // Scan repository
55
- spin.start('Scanning repository...');
56
- const scanResult = await scanRepository(repoRoot, framework);
57
- spin.succeed(`Found ${scanResult.files.length} files`);
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(getScanSummary(scanResult));
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
- // Run AI analysis
71
- logger.header('Running AI Analysis');
72
- logger.info(`Analysis types: ${analysisTypes.join(', ')}`);
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
- spin.start('Analyzing code with Gemini AI...');
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
- spin.succeed(`Analysis complete (${(result.duration / 1000).toFixed(1)}s)`);
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
- logger.divider();
102
- logger.stats({
103
- 'Files Analyzed': scanResult.files.length,
104
- 'Tokens Used': result.totalTokens.toLocaleString(),
105
- 'Duration': `${(result.duration / 1000).toFixed(1)}s`,
106
- 'Report': reportPath
107
- });
108
- logger.divider();
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"}