baseguard 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +25 -0
- package/.prettierrc +8 -0
- package/README.md +94 -0
- package/bin/base.js +494 -0
- package/dist/ai/fix-manager.d.ts +67 -0
- package/dist/ai/fix-manager.d.ts.map +1 -0
- package/dist/ai/fix-manager.js +326 -0
- package/dist/ai/fix-manager.js.map +1 -0
- package/dist/ai/gemini-analyzer.d.ts +116 -0
- package/dist/ai/gemini-analyzer.d.ts.map +1 -0
- package/dist/ai/gemini-analyzer.js +572 -0
- package/dist/ai/gemini-analyzer.js.map +1 -0
- package/dist/ai/index.d.ts +4 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +5 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/jules-implementer.d.ts +115 -0
- package/dist/ai/jules-implementer.d.ts.map +1 -0
- package/dist/ai/jules-implementer.js +387 -0
- package/dist/ai/jules-implementer.js.map +1 -0
- package/dist/commands/automation.d.ts +5 -0
- package/dist/commands/automation.d.ts.map +1 -0
- package/dist/commands/automation.js +305 -0
- package/dist/commands/automation.js.map +1 -0
- package/dist/commands/check.d.ts +9 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +113 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +324 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/fix.d.ts +9 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +207 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +7 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +125 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/core/api-key-manager.d.ts +83 -0
- package/dist/core/api-key-manager.d.ts.map +1 -0
- package/dist/core/api-key-manager.js +244 -0
- package/dist/core/api-key-manager.js.map +1 -0
- package/dist/core/baseguard.d.ts +46 -0
- package/dist/core/baseguard.d.ts.map +1 -0
- package/dist/core/baseguard.js +132 -0
- package/dist/core/baseguard.js.map +1 -0
- package/dist/core/baseline-checker.d.ts +63 -0
- package/dist/core/baseline-checker.d.ts.map +1 -0
- package/dist/core/baseline-checker.js +502 -0
- package/dist/core/baseline-checker.js.map +1 -0
- package/dist/core/cache-manager.d.ts +88 -0
- package/dist/core/cache-manager.d.ts.map +1 -0
- package/dist/core/cache-manager.js +213 -0
- package/dist/core/cache-manager.js.map +1 -0
- package/dist/core/configuration.d.ts +140 -0
- package/dist/core/configuration.d.ts.map +1 -0
- package/dist/core/configuration.js +474 -0
- package/dist/core/configuration.js.map +1 -0
- package/dist/core/directory-filter.d.ts +90 -0
- package/dist/core/directory-filter.d.ts.map +1 -0
- package/dist/core/directory-filter.js +319 -0
- package/dist/core/directory-filter.js.map +1 -0
- package/dist/core/error-handler.d.ts +110 -0
- package/dist/core/error-handler.d.ts.map +1 -0
- package/dist/core/error-handler.js +392 -0
- package/dist/core/error-handler.js.map +1 -0
- package/dist/core/file-processor.d.ts +80 -0
- package/dist/core/file-processor.d.ts.map +1 -0
- package/dist/core/file-processor.js +259 -0
- package/dist/core/file-processor.js.map +1 -0
- package/dist/core/gitignore-manager.d.ts +44 -0
- package/dist/core/gitignore-manager.d.ts.map +1 -0
- package/dist/core/gitignore-manager.js +147 -0
- package/dist/core/gitignore-manager.js.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lazy-loader.d.ts +68 -0
- package/dist/core/lazy-loader.d.ts.map +1 -0
- package/dist/core/lazy-loader.js +260 -0
- package/dist/core/lazy-loader.js.map +1 -0
- package/dist/core/memory-manager.d.ts +1 -0
- package/dist/core/memory-manager.d.ts.map +1 -0
- package/dist/core/memory-manager.js +2 -0
- package/dist/core/memory-manager.js.map +1 -0
- package/dist/core/startup-optimizer.d.ts +45 -0
- package/dist/core/startup-optimizer.d.ts.map +1 -0
- package/dist/core/startup-optimizer.js +140 -0
- package/dist/core/startup-optimizer.js.map +1 -0
- package/dist/git/automation-engine.d.ts +58 -0
- package/dist/git/automation-engine.d.ts.map +1 -0
- package/dist/git/automation-engine.js +318 -0
- package/dist/git/automation-engine.js.map +1 -0
- package/dist/git/github-manager.d.ts +71 -0
- package/dist/git/github-manager.d.ts.map +1 -0
- package/dist/git/github-manager.js +226 -0
- package/dist/git/github-manager.js.map +1 -0
- package/dist/git/hook-manager.d.ts +43 -0
- package/dist/git/hook-manager.d.ts.map +1 -0
- package/dist/git/hook-manager.js +191 -0
- package/dist/git/hook-manager.js.map +1 -0
- package/dist/git/index.d.ts +4 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +5 -0
- package/dist/git/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/feature-validator.d.ts +60 -0
- package/dist/parsers/feature-validator.d.ts.map +1 -0
- package/dist/parsers/feature-validator.js +483 -0
- package/dist/parsers/feature-validator.js.map +1 -0
- package/dist/parsers/index.d.ts +8 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +9 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/parser-manager.d.ts +103 -0
- package/dist/parsers/parser-manager.d.ts.map +1 -0
- package/dist/parsers/parser-manager.js +321 -0
- package/dist/parsers/parser-manager.js.map +1 -0
- package/dist/parsers/parser.d.ts +23 -0
- package/dist/parsers/parser.d.ts.map +1 -0
- package/dist/parsers/parser.js +6 -0
- package/dist/parsers/parser.js.map +1 -0
- package/dist/parsers/react-parser.d.ts +22 -0
- package/dist/parsers/react-parser.d.ts.map +1 -0
- package/dist/parsers/react-parser.js +307 -0
- package/dist/parsers/react-parser.js.map +1 -0
- package/dist/parsers/svelte-parser.d.ts +33 -0
- package/dist/parsers/svelte-parser.d.ts.map +1 -0
- package/dist/parsers/svelte-parser.js +408 -0
- package/dist/parsers/svelte-parser.js.map +1 -0
- package/dist/parsers/vanilla-parser.d.ts +31 -0
- package/dist/parsers/vanilla-parser.d.ts.map +1 -0
- package/dist/parsers/vanilla-parser.js +590 -0
- package/dist/parsers/vanilla-parser.js.map +1 -0
- package/dist/parsers/vue-parser.d.ts +9 -0
- package/dist/parsers/vue-parser.d.ts.map +1 -0
- package/dist/parsers/vue-parser.js +16 -0
- package/dist/parsers/vue-parser.js.map +1 -0
- package/dist/terminal-header.d.ts +12 -0
- package/dist/terminal-header.js +45 -0
- package/dist/types/index.d.ts +83 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/components.d.ts +133 -0
- package/dist/ui/components.d.ts.map +1 -0
- package/dist/ui/components.js +482 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/help.d.ts +11 -0
- package/dist/ui/help.d.ts.map +1 -0
- package/dist/ui/help.js +161 -0
- package/dist/ui/help.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +5 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/prompts.d.ts +63 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +611 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/terminal-header.d.ts +13 -0
- package/dist/ui/terminal-header.d.ts.map +1 -0
- package/dist/ui/terminal-header.js +46 -0
- package/dist/ui/terminal-header.js.map +1 -0
- package/package.json +80 -0
- package/src/ai/__tests__/gemini-analyzer.test.ts +181 -0
- package/src/ai/fix-manager.ts +362 -0
- package/src/ai/gemini-analyzer.ts +671 -0
- package/src/ai/index.ts +4 -0
- package/src/ai/jules-implementer.ts +459 -0
- package/src/commands/automation.ts +344 -0
- package/src/commands/check.ts +299 -0
- package/src/commands/config.ts +365 -0
- package/src/commands/fix.ts +234 -0
- package/src/commands/index.ts +6 -0
- package/src/commands/init.ts +142 -0
- package/src/commands/status.ts +0 -0
- package/src/core/api-key-manager.ts +298 -0
- package/src/core/baseguard.ts +742 -0
- package/src/core/baseline-checker.ts +563 -0
- package/src/core/cache-manager.ts +270 -0
- package/src/core/configuration-recovery.ts +676 -0
- package/src/core/configuration.ts +559 -0
- package/src/core/debug-logger.ts +590 -0
- package/src/core/directory-filter.ts +421 -0
- package/src/core/error-handler.ts +517 -0
- package/src/core/file-processor.ts +331 -0
- package/src/core/gitignore-manager.ts +169 -0
- package/src/core/graceful-degradation-manager.ts +596 -0
- package/src/core/index.ts +13 -0
- package/src/core/lazy-loader.ts +307 -0
- package/src/core/logger.ts +0 -0
- package/src/core/memory-manager.ts +294 -0
- package/src/core/startup-optimizer.ts +173 -0
- package/src/core/system-error-handler.ts +746 -0
- package/src/git/automation-engine.ts +361 -0
- package/src/git/github-manager.ts +260 -0
- package/src/git/hook-manager.ts +210 -0
- package/src/git/index.ts +4 -0
- package/src/index.ts +8 -0
- package/src/parsers/feature-validator.ts +559 -0
- package/src/parsers/index.ts +8 -0
- package/src/parsers/parser-manager.ts +419 -0
- package/src/parsers/parser.ts +26 -0
- package/src/parsers/react-parser-optimized.ts +161 -0
- package/src/parsers/react-parser.ts +359 -0
- package/src/parsers/svelte-parser.ts +506 -0
- package/src/parsers/vanilla-parser.ts +682 -0
- package/src/parsers/vue-parser.ts +472 -0
- package/src/types/index.ts +92 -0
- package/src/ui/components.ts +567 -0
- package/src/ui/help.ts +193 -0
- package/src/ui/index.ts +4 -0
- package/src/ui/prompts.ts +688 -0
- package/src/ui/terminal-header.ts +59 -0
- package/test-config-commands.js +56 -0
- package/test-header-simple.js +33 -0
- package/test-terminal-header.js +12 -0
- package/test-ui.js +29 -0
- package/tests/e2e/baseguard.e2e.test.ts +516 -0
- package/tests/e2e/cross-platform.e2e.test.ts +420 -0
- package/tests/e2e/git-integration.e2e.test.ts +487 -0
- package/tests/fixtures/react-project/package.json +14 -0
- package/tests/fixtures/react-project/src/App.css +76 -0
- package/tests/fixtures/react-project/src/App.tsx +77 -0
- package/tests/fixtures/svelte-project/package.json +11 -0
- package/tests/fixtures/svelte-project/src/App.svelte +369 -0
- package/tests/fixtures/vanilla-project/index.html +76 -0
- package/tests/fixtures/vanilla-project/script.js +331 -0
- package/tests/fixtures/vanilla-project/styles.css +359 -0
- package/tests/fixtures/vue-project/package.json +12 -0
- package/tests/fixtures/vue-project/src/App.vue +216 -0
- package/tsconfig.json +36 -0
- package/vitest.config.ts +10 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-manager.d.ts","sourceRoot":"","sources":["../../src/ai/fix-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAa,MAAM,mBAAmB,CAAC;AAExD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,YAAY,CAAgE;IAEpF;;OAEG;IACG,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAWhD;;OAEG;IACG,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IA0DhD;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BvC;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAAC,OAAO,EAAE,GAAG,EAAE,CAAC;QAAC,MAAM,EAAE;YAAE,GAAG,EAAE,GAAG,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IA8BlH;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBlD;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAcvC;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAI3B;;OAEG;YACW,YAAY;IAa1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmC3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiDzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;YACW,gBAAgB;CAyB/B"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { readFile, writeFile, copyFile } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { join, dirname } from 'path';
|
|
4
|
+
import { mkdir } from 'fs/promises';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
/**
|
|
7
|
+
* Fix manager for previewing and applying code fixes
|
|
8
|
+
*/
|
|
9
|
+
export class FixManager {
|
|
10
|
+
appliedFixes = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Generate unified diff preview of proposed changes
|
|
13
|
+
*/
|
|
14
|
+
async generatePreview(fix) {
|
|
15
|
+
try {
|
|
16
|
+
const originalContent = await readFile(fix.filePath, 'utf8');
|
|
17
|
+
const modifiedContent = this.applyPatchToContent(originalContent, fix.patch);
|
|
18
|
+
return this.createUnifiedDiff(fix.filePath, originalContent, modifiedContent);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
throw new Error(`Failed to generate preview: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Show interactive fix approval with clear change descriptions
|
|
26
|
+
*/
|
|
27
|
+
async showFixPreview(fix) {
|
|
28
|
+
console.log(chalk.cyan(`\n🔧 Fix Preview for ${fix.violation.feature} in ${fix.filePath}\n`));
|
|
29
|
+
// Show fix explanation
|
|
30
|
+
console.log(chalk.white('📋 Fix Description:'));
|
|
31
|
+
console.log(chalk.dim(fix.explanation));
|
|
32
|
+
console.log();
|
|
33
|
+
// Show confidence score
|
|
34
|
+
const confidenceColor = fix.confidence >= 0.8 ? 'green' : fix.confidence >= 0.6 ? 'yellow' : 'red';
|
|
35
|
+
console.log(chalk.white('🎯 Confidence: ') + chalk[confidenceColor](`${Math.round(fix.confidence * 100)}%`));
|
|
36
|
+
console.log();
|
|
37
|
+
// Show unified diff
|
|
38
|
+
console.log(chalk.white('📝 Changes:'));
|
|
39
|
+
const preview = await this.generatePreview(fix);
|
|
40
|
+
console.log(this.colorizeUnifiedDiff(preview));
|
|
41
|
+
console.log();
|
|
42
|
+
// Show human-readable preview
|
|
43
|
+
if (fix.preview) {
|
|
44
|
+
console.log(chalk.white('👀 Summary:'));
|
|
45
|
+
console.log(chalk.dim(fix.preview));
|
|
46
|
+
console.log();
|
|
47
|
+
}
|
|
48
|
+
// Interactive approval
|
|
49
|
+
const { default: inquirer } = await import('inquirer');
|
|
50
|
+
const { action } = await inquirer.prompt([
|
|
51
|
+
{
|
|
52
|
+
type: 'list',
|
|
53
|
+
name: 'action',
|
|
54
|
+
message: 'What would you like to do with this fix?',
|
|
55
|
+
choices: [
|
|
56
|
+
{ name: '✅ Apply this fix', value: 'apply' },
|
|
57
|
+
{ name: '👀 Show detailed diff', value: 'detail' },
|
|
58
|
+
{ name: '❌ Skip this fix', value: 'skip' },
|
|
59
|
+
{ name: '🚫 Cancel all fixes', value: 'cancel' }
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
]);
|
|
63
|
+
switch (action) {
|
|
64
|
+
case 'apply':
|
|
65
|
+
return true;
|
|
66
|
+
case 'detail':
|
|
67
|
+
await this.showDetailedDiff(fix);
|
|
68
|
+
return await this.showFixPreview(fix); // Show preview again
|
|
69
|
+
case 'skip':
|
|
70
|
+
return false;
|
|
71
|
+
case 'cancel':
|
|
72
|
+
throw new Error('Fix application cancelled by user');
|
|
73
|
+
default:
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Apply fixes to original files while preserving formatting and structure
|
|
79
|
+
*/
|
|
80
|
+
async applyFix(fix) {
|
|
81
|
+
try {
|
|
82
|
+
// Create backup before applying fix
|
|
83
|
+
await this.createBackup(fix.filePath);
|
|
84
|
+
// Read original content
|
|
85
|
+
const originalContent = await readFile(fix.filePath, 'utf8');
|
|
86
|
+
// Apply patch to content
|
|
87
|
+
const modifiedContent = this.applyPatchToContent(originalContent, fix.patch);
|
|
88
|
+
// Write modified content back to file
|
|
89
|
+
await writeFile(fix.filePath, modifiedContent, 'utf8');
|
|
90
|
+
// Store fix information for potential rollback
|
|
91
|
+
this.appliedFixes.set(fix.filePath, {
|
|
92
|
+
original: originalContent,
|
|
93
|
+
backup: this.getBackupPath(fix.filePath)
|
|
94
|
+
});
|
|
95
|
+
console.log(chalk.green(`✅ Applied fix to ${fix.filePath}`));
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw new Error(`Failed to apply fix: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Apply multiple fixes with batch processing
|
|
103
|
+
*/
|
|
104
|
+
async applyFixes(fixes) {
|
|
105
|
+
const results = {
|
|
106
|
+
applied: [],
|
|
107
|
+
skipped: [],
|
|
108
|
+
failed: []
|
|
109
|
+
};
|
|
110
|
+
console.log(chalk.cyan(`\n🔧 Applying ${fixes.length} fixes...\n`));
|
|
111
|
+
for (const fix of fixes) {
|
|
112
|
+
try {
|
|
113
|
+
const shouldApply = await this.showFixPreview(fix);
|
|
114
|
+
if (shouldApply) {
|
|
115
|
+
await this.applyFix(fix);
|
|
116
|
+
results.applied.push(fix);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
results.skipped.push(fix);
|
|
120
|
+
console.log(chalk.yellow(`⏭️ Skipped fix for ${fix.filePath}`));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
125
|
+
results.failed.push({ fix, error: errorMessage });
|
|
126
|
+
console.log(chalk.red(`❌ Failed to apply fix for ${fix.filePath}: ${errorMessage}`));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return results;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Rollback applied fixes
|
|
133
|
+
*/
|
|
134
|
+
async rollbackFix(filePath) {
|
|
135
|
+
const fixInfo = this.appliedFixes.get(filePath);
|
|
136
|
+
if (!fixInfo) {
|
|
137
|
+
throw new Error(`No applied fix found for ${filePath}`);
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
// Restore original content
|
|
141
|
+
await writeFile(filePath, fixInfo.original, 'utf8');
|
|
142
|
+
// Remove from applied fixes
|
|
143
|
+
this.appliedFixes.delete(filePath);
|
|
144
|
+
console.log(chalk.green(`✅ Rolled back fix for ${filePath}`));
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
throw new Error(`Failed to rollback fix: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Rollback all applied fixes
|
|
152
|
+
*/
|
|
153
|
+
async rollbackAllFixes() {
|
|
154
|
+
const filePaths = Array.from(this.appliedFixes.keys());
|
|
155
|
+
console.log(chalk.cyan(`\n🔄 Rolling back ${filePaths.length} fixes...\n`));
|
|
156
|
+
for (const filePath of filePaths) {
|
|
157
|
+
try {
|
|
158
|
+
await this.rollbackFix(filePath);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
console.log(chalk.red(`❌ Failed to rollback ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get list of applied fixes
|
|
167
|
+
*/
|
|
168
|
+
getAppliedFixes() {
|
|
169
|
+
return Array.from(this.appliedFixes.keys());
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Create backup of original file
|
|
173
|
+
*/
|
|
174
|
+
async createBackup(filePath) {
|
|
175
|
+
const backupPath = this.getBackupPath(filePath);
|
|
176
|
+
const backupDir = dirname(backupPath);
|
|
177
|
+
// Ensure backup directory exists
|
|
178
|
+
if (!existsSync(backupDir)) {
|
|
179
|
+
await mkdir(backupDir, { recursive: true });
|
|
180
|
+
}
|
|
181
|
+
// Copy original file to backup location
|
|
182
|
+
await copyFile(filePath, backupPath);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Get backup file path
|
|
186
|
+
*/
|
|
187
|
+
getBackupPath(filePath) {
|
|
188
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
189
|
+
return join('.baseguard', 'backups', `${filePath.replace(/[/\\]/g, '_')}.${timestamp}.backup`);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Apply patch to file content
|
|
193
|
+
*/
|
|
194
|
+
applyPatchToContent(originalContent, patch) {
|
|
195
|
+
const lines = originalContent.split('\n');
|
|
196
|
+
const patchLines = patch.split('\n');
|
|
197
|
+
let result = [...lines];
|
|
198
|
+
let currentLine = 0;
|
|
199
|
+
for (const patchLine of patchLines) {
|
|
200
|
+
if (patchLine.startsWith('@@')) {
|
|
201
|
+
// Parse hunk header to get line numbers
|
|
202
|
+
const match = patchLine.match(/@@ -(\d+),?\d* \+(\d+),?\d* @@/);
|
|
203
|
+
if (match && match[2]) {
|
|
204
|
+
currentLine = parseInt(match[2]) - 1;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else if (patchLine.startsWith('-')) {
|
|
208
|
+
// Remove line
|
|
209
|
+
const lineToRemove = patchLine.substring(1);
|
|
210
|
+
const index = result.findIndex((line, i) => i >= currentLine && line.trim() === lineToRemove.trim());
|
|
211
|
+
if (index !== -1) {
|
|
212
|
+
result.splice(index, 1);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else if (patchLine.startsWith('+')) {
|
|
216
|
+
// Add line
|
|
217
|
+
const lineToAdd = patchLine.substring(1);
|
|
218
|
+
result.splice(currentLine, 0, lineToAdd);
|
|
219
|
+
currentLine++;
|
|
220
|
+
}
|
|
221
|
+
else if (patchLine.startsWith(' ')) {
|
|
222
|
+
// Context line - advance current line
|
|
223
|
+
currentLine++;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return result.join('\n');
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Create unified diff between original and modified content
|
|
230
|
+
*/
|
|
231
|
+
createUnifiedDiff(filePath, original, modified) {
|
|
232
|
+
const originalLines = original.split('\n');
|
|
233
|
+
const modifiedLines = modified.split('\n');
|
|
234
|
+
let diff = `--- a/${filePath}\n+++ b/${filePath}\n`;
|
|
235
|
+
// Simple diff algorithm (in production, use a proper diff library)
|
|
236
|
+
let i = 0, j = 0;
|
|
237
|
+
while (i < originalLines.length || j < modifiedLines.length) {
|
|
238
|
+
const originalLine = originalLines[i] || '';
|
|
239
|
+
const modifiedLine = modifiedLines[j] || '';
|
|
240
|
+
if (originalLine === modifiedLine) {
|
|
241
|
+
diff += ` ${originalLine}\n`;
|
|
242
|
+
i++;
|
|
243
|
+
j++;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
// Find next matching line
|
|
247
|
+
let nextMatch = -1;
|
|
248
|
+
for (let k = j + 1; k < modifiedLines.length; k++) {
|
|
249
|
+
if (modifiedLines[k] === originalLine) {
|
|
250
|
+
nextMatch = k;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (nextMatch !== -1) {
|
|
255
|
+
// Lines were added
|
|
256
|
+
for (let k = j; k < nextMatch; k++) {
|
|
257
|
+
diff += `+${modifiedLines[k]}\n`;
|
|
258
|
+
}
|
|
259
|
+
j = nextMatch;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
// Line was removed or changed
|
|
263
|
+
if (i < originalLines.length) {
|
|
264
|
+
diff += `-${originalLine}\n`;
|
|
265
|
+
i++;
|
|
266
|
+
}
|
|
267
|
+
if (j < modifiedLines.length) {
|
|
268
|
+
diff += `+${modifiedLine}\n`;
|
|
269
|
+
j++;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return diff;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Colorize unified diff for better readability
|
|
278
|
+
*/
|
|
279
|
+
colorizeUnifiedDiff(diff) {
|
|
280
|
+
return diff
|
|
281
|
+
.split('\n')
|
|
282
|
+
.map(line => {
|
|
283
|
+
if (line.startsWith('+++') || line.startsWith('---')) {
|
|
284
|
+
return chalk.bold(line);
|
|
285
|
+
}
|
|
286
|
+
else if (line.startsWith('@@')) {
|
|
287
|
+
return chalk.cyan(line);
|
|
288
|
+
}
|
|
289
|
+
else if (line.startsWith('+')) {
|
|
290
|
+
return chalk.green(line);
|
|
291
|
+
}
|
|
292
|
+
else if (line.startsWith('-')) {
|
|
293
|
+
return chalk.red(line);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
return chalk.dim(line);
|
|
297
|
+
}
|
|
298
|
+
})
|
|
299
|
+
.join('\n');
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Show detailed diff with more context
|
|
303
|
+
*/
|
|
304
|
+
async showDetailedDiff(fix) {
|
|
305
|
+
console.log(chalk.cyan(`\n📋 Detailed Diff for ${fix.filePath}\n`));
|
|
306
|
+
try {
|
|
307
|
+
const originalContent = await readFile(fix.filePath, 'utf8');
|
|
308
|
+
const modifiedContent = this.applyPatchToContent(originalContent, fix.patch);
|
|
309
|
+
const originalLines = originalContent.split('\n');
|
|
310
|
+
const modifiedLines = modifiedContent.split('\n');
|
|
311
|
+
console.log(chalk.white('Original:'));
|
|
312
|
+
originalLines.forEach((line, i) => {
|
|
313
|
+
console.log(chalk.dim(`${(i + 1).toString().padStart(3)} | `) + line);
|
|
314
|
+
});
|
|
315
|
+
console.log(chalk.white('\nModified:'));
|
|
316
|
+
modifiedLines.forEach((line, i) => {
|
|
317
|
+
console.log(chalk.dim(`${(i + 1).toString().padStart(3)} | `) + line);
|
|
318
|
+
});
|
|
319
|
+
console.log();
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
console.log(chalk.red(`Failed to show detailed diff: ${error instanceof Error ? error.message : 'Unknown error'}`));
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=fix-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-manager.js","sourceRoot":"","sources":["../../src/ai/fix-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { Violation, Analysis } from '../types/index.js';
|
|
2
|
+
import { ErrorType } from '../core/error-handler.js';
|
|
3
|
+
/**
|
|
4
|
+
* Gemini AI analyzer for compatibility violations
|
|
5
|
+
*/
|
|
6
|
+
export declare class GeminiAnalyzer {
|
|
7
|
+
private apiKey;
|
|
8
|
+
private baseUrl;
|
|
9
|
+
private cache;
|
|
10
|
+
private readonly cacheTtl;
|
|
11
|
+
constructor(apiKey: string);
|
|
12
|
+
/**
|
|
13
|
+
* Analyze a violation using Gemini AI with web search
|
|
14
|
+
*/
|
|
15
|
+
analyzeViolation(violation: Violation): Promise<Analysis>;
|
|
16
|
+
/**
|
|
17
|
+
* Make API call to Gemini (retry logic handled by ErrorHandler)
|
|
18
|
+
*/
|
|
19
|
+
private makeApiCall;
|
|
20
|
+
/**
|
|
21
|
+
* Build analysis prompt for Gemini
|
|
22
|
+
*/
|
|
23
|
+
private buildAnalysisPrompt;
|
|
24
|
+
/**
|
|
25
|
+
* Parse Gemini response into structured analysis
|
|
26
|
+
*/
|
|
27
|
+
private parseAnalysisResponse;
|
|
28
|
+
/**
|
|
29
|
+
* Extract sources from grounding metadata
|
|
30
|
+
*/
|
|
31
|
+
private extractSources;
|
|
32
|
+
/**
|
|
33
|
+
* Extract user impact from response text
|
|
34
|
+
*/
|
|
35
|
+
private extractUserImpact;
|
|
36
|
+
/**
|
|
37
|
+
* Extract market share percentage from response
|
|
38
|
+
*/
|
|
39
|
+
private extractMarketShare;
|
|
40
|
+
/**
|
|
41
|
+
* Get current violation being processed (for fallback messages)
|
|
42
|
+
*/
|
|
43
|
+
private getCurrentViolation;
|
|
44
|
+
/**
|
|
45
|
+
* Extract fix strategy from response
|
|
46
|
+
*/
|
|
47
|
+
private extractFixStrategy;
|
|
48
|
+
/**
|
|
49
|
+
* Extract best practices from response
|
|
50
|
+
*/
|
|
51
|
+
private extractBestPractices;
|
|
52
|
+
/**
|
|
53
|
+
* Clean up plain English explanation
|
|
54
|
+
*/
|
|
55
|
+
private cleanupPlainEnglish;
|
|
56
|
+
/**
|
|
57
|
+
* Calculate confidence score based on grounding quality
|
|
58
|
+
*/
|
|
59
|
+
private calculateConfidence;
|
|
60
|
+
/**
|
|
61
|
+
* Create fallback analysis when API fails
|
|
62
|
+
*/
|
|
63
|
+
private createFallbackAnalysis;
|
|
64
|
+
/**
|
|
65
|
+
* Estimate market share for fallback analysis
|
|
66
|
+
*/
|
|
67
|
+
private estimateMarketShare;
|
|
68
|
+
/**
|
|
69
|
+
* Get default fix strategy based on feature type
|
|
70
|
+
*/
|
|
71
|
+
private getDefaultFixStrategy;
|
|
72
|
+
/**
|
|
73
|
+
* Generate cache key for a violation
|
|
74
|
+
*/
|
|
75
|
+
private generateCacheKey;
|
|
76
|
+
/**
|
|
77
|
+
* Get cached analysis if available and not expired
|
|
78
|
+
*/
|
|
79
|
+
private getCachedAnalysis;
|
|
80
|
+
/**
|
|
81
|
+
* Cache analysis result
|
|
82
|
+
*/
|
|
83
|
+
private cacheAnalysis;
|
|
84
|
+
/**
|
|
85
|
+
* Clean up expired cache entries
|
|
86
|
+
*/
|
|
87
|
+
private cleanupCache;
|
|
88
|
+
/**
|
|
89
|
+
* Clear all cached analyses
|
|
90
|
+
*/
|
|
91
|
+
clearCache(): void;
|
|
92
|
+
/**
|
|
93
|
+
* Get cache statistics
|
|
94
|
+
*/
|
|
95
|
+
getCacheStats(): {
|
|
96
|
+
size: number;
|
|
97
|
+
hitRate?: number;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Analyze multiple violations with concurrency control
|
|
101
|
+
*/
|
|
102
|
+
analyzeViolations(violations: Violation[], maxConcurrent?: number): Promise<Analysis[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Validate API key format
|
|
105
|
+
*/
|
|
106
|
+
static validateApiKey(apiKey: string): boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Test API connectivity
|
|
109
|
+
*/
|
|
110
|
+
testConnection(): Promise<{
|
|
111
|
+
success: boolean;
|
|
112
|
+
error?: string;
|
|
113
|
+
errorType?: ErrorType;
|
|
114
|
+
}>;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=gemini-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-analyzer.d.ts","sourceRoot":"","sources":["../../src/ai/gemini-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAA0B,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAW7E;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAkG;IACjH,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;gBAEpC,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;IAuF/D;;OAEG;YACW,WAAW;IAsCzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+B3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA4B7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoC5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiC3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACI,UAAU,IAAI,IAAI;IAIzB;;OAEG;IACI,aAAa,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAM1D;;OAEG;IACG,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,aAAa,SAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmCxF;;OAEG;WACW,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAMrD;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;CA4B7F"}
|