couchloop-eq-mcp 1.0.4 → 1.0.5
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 +24 -11
- package/dist/developer/analyzers/bloat-detector.d.ts +89 -0
- package/dist/developer/analyzers/bloat-detector.d.ts.map +1 -0
- package/dist/developer/analyzers/bloat-detector.js +483 -0
- package/dist/developer/analyzers/bloat-detector.js.map +1 -0
- package/dist/developer/backup/auto-backup.d.ts +96 -0
- package/dist/developer/backup/auto-backup.d.ts.map +1 -0
- package/dist/developer/backup/auto-backup.js +346 -0
- package/dist/developer/backup/auto-backup.js.map +1 -0
- package/dist/developer/blockers/package-blocker.d.ts +33 -0
- package/dist/developer/blockers/package-blocker.d.ts.map +1 -0
- package/dist/developer/blockers/package-blocker.js +224 -0
- package/dist/developer/blockers/package-blocker.js.map +1 -0
- package/dist/developer/evaluators/ai-error-preventer.d.ts +54 -0
- package/dist/developer/evaluators/ai-error-preventer.d.ts.map +1 -0
- package/dist/developer/evaluators/ai-error-preventer.js +270 -0
- package/dist/developer/evaluators/ai-error-preventer.js.map +1 -0
- package/dist/developer/evaluators/build-context-detector.d.ts +44 -0
- package/dist/developer/evaluators/build-context-detector.d.ts.map +1 -0
- package/dist/developer/evaluators/build-context-detector.js +258 -0
- package/dist/developer/evaluators/build-context-detector.js.map +1 -0
- package/dist/developer/evaluators/package-evaluator.d.ts +37 -0
- package/dist/developer/evaluators/package-evaluator.d.ts.map +1 -0
- package/dist/developer/evaluators/package-evaluator.js +278 -0
- package/dist/developer/evaluators/package-evaluator.js.map +1 -0
- package/dist/developer/guards/file-guardian.d.ts +79 -0
- package/dist/developer/guards/file-guardian.d.ts.map +1 -0
- package/dist/developer/guards/file-guardian.js +309 -0
- package/dist/developer/guards/file-guardian.js.map +1 -0
- package/dist/developer/managers/context-manager.d.ts +61 -0
- package/dist/developer/managers/context-manager.d.ts.map +1 -0
- package/dist/developer/managers/context-manager.js +302 -0
- package/dist/developer/managers/context-manager.js.map +1 -0
- package/dist/developer/metrics/complexity-calculator.d.ts +52 -0
- package/dist/developer/metrics/complexity-calculator.d.ts.map +1 -0
- package/dist/developer/metrics/complexity-calculator.js +259 -0
- package/dist/developer/metrics/complexity-calculator.js.map +1 -0
- package/dist/developer/reports/review-summary.d.ts +49 -0
- package/dist/developer/reports/review-summary.d.ts.map +1 -0
- package/dist/developer/reports/review-summary.js +249 -0
- package/dist/developer/reports/review-summary.js.map +1 -0
- package/dist/developer/scanners/review-assistant.d.ts +41 -0
- package/dist/developer/scanners/review-assistant.d.ts.map +1 -0
- package/dist/developer/scanners/review-assistant.js +374 -0
- package/dist/developer/scanners/review-assistant.js.map +1 -0
- package/dist/developer/scanners/secret-scanner.d.ts +66 -0
- package/dist/developer/scanners/secret-scanner.d.ts.map +1 -0
- package/dist/developer/scanners/secret-scanner.js +287 -0
- package/dist/developer/scanners/secret-scanner.js.map +1 -0
- package/dist/developer/scanners/sql-injection-detector.d.ts +54 -0
- package/dist/developer/scanners/sql-injection-detector.d.ts.map +1 -0
- package/dist/developer/scanners/sql-injection-detector.js +174 -0
- package/dist/developer/scanners/sql-injection-detector.js.map +1 -0
- package/dist/developer/scanners/xss-detector.d.ts +60 -0
- package/dist/developer/scanners/xss-detector.d.ts.map +1 -0
- package/dist/developer/scanners/xss-detector.js +229 -0
- package/dist/developer/scanners/xss-detector.js.map +1 -0
- package/dist/developer/types/ai-errors.d.ts +34 -0
- package/dist/developer/types/ai-errors.d.ts.map +1 -0
- package/dist/developer/types/ai-errors.js +271 -0
- package/dist/developer/types/ai-errors.js.map +1 -0
- package/dist/developer/types/package.d.ts +32 -0
- package/dist/developer/types/package.d.ts.map +1 -0
- package/dist/developer/types/package.js +5 -0
- package/dist/developer/types/package.js.map +1 -0
- package/dist/developer/updaters/dependency-updater.d.ts +102 -0
- package/dist/developer/updaters/dependency-updater.d.ts.map +1 -0
- package/dist/developer/updaters/dependency-updater.js +472 -0
- package/dist/developer/updaters/dependency-updater.js.map +1 -0
- package/dist/developer/validators/cargo.d.ts +14 -0
- package/dist/developer/validators/cargo.d.ts.map +1 -0
- package/dist/developer/validators/cargo.js +132 -0
- package/dist/developer/validators/cargo.js.map +1 -0
- package/dist/developer/validators/gem.d.ts +14 -0
- package/dist/developer/validators/gem.d.ts.map +1 -0
- package/dist/developer/validators/gem.js +85 -0
- package/dist/developer/validators/gem.js.map +1 -0
- package/dist/developer/validators/go.d.ts +14 -0
- package/dist/developer/validators/go.d.ts.map +1 -0
- package/dist/developer/validators/go.js +138 -0
- package/dist/developer/validators/go.js.map +1 -0
- package/dist/developer/validators/maven.d.ts +14 -0
- package/dist/developer/validators/maven.d.ts.map +1 -0
- package/dist/developer/validators/maven.js +99 -0
- package/dist/developer/validators/maven.js.map +1 -0
- package/dist/developer/validators/npm.d.ts +14 -0
- package/dist/developer/validators/npm.d.ts.map +1 -0
- package/dist/developer/validators/npm.js +96 -0
- package/dist/developer/validators/npm.js.map +1 -0
- package/dist/developer/validators/nuget.d.ts +15 -0
- package/dist/developer/validators/nuget.d.ts.map +1 -0
- package/dist/developer/validators/nuget.js +107 -0
- package/dist/developer/validators/nuget.js.map +1 -0
- package/dist/developer/validators/pypi.d.ts +14 -0
- package/dist/developer/validators/pypi.d.ts.map +1 -0
- package/dist/developer/validators/pypi.js +118 -0
- package/dist/developer/validators/pypi.js.map +1 -0
- package/dist/developer/validators/registry-manager.d.ts +37 -0
- package/dist/developer/validators/registry-manager.d.ts.map +1 -0
- package/dist/developer/validators/registry-manager.js +89 -0
- package/dist/developer/validators/registry-manager.js.map +1 -0
- package/dist/developer/validators/version-checker.d.ts +145 -0
- package/dist/developer/validators/version-checker.d.ts.map +1 -0
- package/dist/developer/validators/version-checker.js +529 -0
- package/dist/developer/validators/version-checker.js.map +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/auth.d.ts +7 -9
- package/dist/server/middleware/auth.d.ts.map +1 -1
- package/dist/server/middleware/auth.js.map +1 -1
- package/dist/tools/check-versions.d.ts +100 -0
- package/dist/tools/check-versions.d.ts.map +1 -0
- package/dist/tools/check-versions.js +328 -0
- package/dist/tools/check-versions.js.map +1 -0
- package/dist/tools/detect-code-smell.d.ts +9 -0
- package/dist/tools/detect-code-smell.d.ts.map +1 -0
- package/dist/tools/detect-code-smell.js +231 -0
- package/dist/tools/detect-code-smell.js.map +1 -0
- package/dist/tools/index.d.ts +471 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +178 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/journey.js +1 -1
- package/dist/tools/journey.js.map +1 -1
- package/dist/tools/pre-review-code.d.ts +71 -0
- package/dist/tools/pre-review-code.d.ts.map +1 -0
- package/dist/tools/pre-review-code.js +159 -0
- package/dist/tools/pre-review-code.js.map +1 -0
- package/dist/tools/preserve-context.d.ts +27 -0
- package/dist/tools/preserve-context.d.ts.map +1 -0
- package/dist/tools/preserve-context.js +98 -0
- package/dist/tools/preserve-context.js.map +1 -0
- package/dist/tools/protect-files.d.ts +224 -0
- package/dist/tools/protect-files.d.ts.map +1 -0
- package/dist/tools/protect-files.js +286 -0
- package/dist/tools/protect-files.js.map +1 -0
- package/dist/tools/scan-security.d.ts +38 -0
- package/dist/tools/scan-security.d.ts.map +1 -0
- package/dist/tools/scan-security.js +237 -0
- package/dist/tools/scan-security.js.map +1 -0
- package/dist/tools/validate_packages.d.ts +8 -0
- package/dist/tools/validate_packages.d.ts.map +1 -0
- package/dist/tools/validate_packages.js +159 -0
- package/dist/tools/validate_packages.js.map +1 -0
- package/dist/types/auth.d.ts.map +1 -1
- package/dist/types/auth.js +1 -2
- package/dist/types/auth.js.map +1 -1
- package/dist/types/context.d.ts +46 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +17 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/file-protection.d.ts +50 -0
- package/dist/types/file-protection.d.ts.map +1 -0
- package/dist/types/file-protection.js +9 -0
- package/dist/types/file-protection.js.map +1 -0
- package/dist/utils/errorHandler.d.ts.map +1 -1
- package/dist/utils/errorHandler.js +2 -1
- package/dist/utils/errorHandler.js.map +1 -1
- package/package.json +23 -2
- package/dist/db/migrate.d.ts +0 -4
- package/dist/db/migrate.d.ts.map +0 -1
- package/dist/db/migrate.js +0 -34
- package/dist/db/migrate.js.map +0 -1
- package/dist/db/migrations/schema.d.ts +0 -1074
- package/dist/db/migrations/schema.d.ts.map +0 -1
- package/dist/db/migrations/schema.js +0 -160
- package/dist/db/migrations/schema.js.map +0 -1
- package/dist/db/schema.d.ts +0 -1576
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/db/schema.js +0 -204
- package/dist/db/schema.js.map +0 -1
- package/dist/db/seed.d.ts +0 -4
- package/dist/db/seed.d.ts.map +0 -1
- package/dist/db/seed.js +0 -57
- package/dist/db/seed.js.map +0 -1
- package/dist/db/seedOAuth.d.ts +0 -4
- package/dist/db/seedOAuth.d.ts.map +0 -1
- package/dist/db/seedOAuth.js +0 -76
- package/dist/db/seedOAuth.js.map +0 -1
- package/dist/governance/config.d.ts +0 -66
- package/dist/governance/config.d.ts.map +0 -1
- package/dist/governance/config.js +0 -238
- package/dist/governance/config.js.map +0 -1
- package/dist/governance/detectors/hallucination.d.ts +0 -61
- package/dist/governance/detectors/hallucination.d.ts.map +0 -1
- package/dist/governance/detectors/hallucination.js +0 -338
- package/dist/governance/detectors/hallucination.js.map +0 -1
- package/dist/governance/detectors/inconsistency.d.ts +0 -99
- package/dist/governance/detectors/inconsistency.d.ts.map +0 -1
- package/dist/governance/detectors/inconsistency.js +0 -548
- package/dist/governance/detectors/inconsistency.js.map +0 -1
- package/dist/governance/detectors/toneDrift.d.ts +0 -63
- package/dist/governance/detectors/toneDrift.d.ts.map +0 -1
- package/dist/governance/detectors/toneDrift.js +0 -421
- package/dist/governance/detectors/toneDrift.js.map +0 -1
- package/dist/governance/detectors/unsafeReasoning.d.ts +0 -54
- package/dist/governance/detectors/unsafeReasoning.d.ts.map +0 -1
- package/dist/governance/detectors/unsafeReasoning.js +0 -473
- package/dist/governance/detectors/unsafeReasoning.js.map +0 -1
- package/dist/governance/evaluationEngine.d.ts +0 -112
- package/dist/governance/evaluationEngine.d.ts.map +0 -1
- package/dist/governance/evaluationEngine.js +0 -265
- package/dist/governance/evaluationEngine.js.map +0 -1
- package/dist/governance/intervention.d.ts +0 -81
- package/dist/governance/intervention.d.ts.map +0 -1
- package/dist/governance/intervention.js +0 -405
- package/dist/governance/intervention.js.map +0 -1
- package/dist/server/oauth/anomalyDetection.d.ts +0 -146
- package/dist/server/oauth/anomalyDetection.d.ts.map +0 -1
- package/dist/server/oauth/anomalyDetection.js +0 -405
- package/dist/server/oauth/anomalyDetection.js.map +0 -1
- package/dist/server/oauth/authServer.d.ts +0 -61
- package/dist/server/oauth/authServer.d.ts.map +0 -1
- package/dist/server/oauth/authServer.js +0 -283
- package/dist/server/oauth/authServer.js.map +0 -1
- package/dist/server/oauth/dpop.d.ts +0 -135
- package/dist/server/oauth/dpop.d.ts.map +0 -1
- package/dist/server/oauth/dpop.js +0 -338
- package/dist/server/oauth/dpop.js.map +0 -1
- package/dist/server/oauth/gdpr/consent.d.ts +0 -173
- package/dist/server/oauth/gdpr/consent.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/consent.js +0 -388
- package/dist/server/oauth/gdpr/consent.js.map +0 -1
- package/dist/server/oauth/gdpr/dataPortability.d.ts +0 -214
- package/dist/server/oauth/gdpr/dataPortability.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/dataPortability.js +0 -486
- package/dist/server/oauth/gdpr/dataPortability.js.map +0 -1
- package/dist/server/oauth/gdpr/index.d.ts +0 -103
- package/dist/server/oauth/gdpr/index.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/index.js +0 -273
- package/dist/server/oauth/gdpr/index.js.map +0 -1
- package/dist/server/oauth/gdpr/rightToErasure.d.ts +0 -184
- package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/rightToErasure.js +0 -527
- package/dist/server/oauth/gdpr/rightToErasure.js.map +0 -1
- package/dist/server/oauth/monitoring/securityMonitor.d.ts +0 -218
- package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +0 -1
- package/dist/server/oauth/monitoring/securityMonitor.js +0 -615
- package/dist/server/oauth/monitoring/securityMonitor.js.map +0 -1
- package/dist/server/oauth/pkce.d.ts +0 -61
- package/dist/server/oauth/pkce.d.ts.map +0 -1
- package/dist/server/oauth/pkce.js +0 -157
- package/dist/server/oauth/pkce.js.map +0 -1
- package/dist/server/oauth/providers/base.d.ts +0 -147
- package/dist/server/oauth/providers/base.d.ts.map +0 -1
- package/dist/server/oauth/providers/base.js +0 -312
- package/dist/server/oauth/providers/base.js.map +0 -1
- package/dist/server/oauth/providers/github.d.ts +0 -55
- package/dist/server/oauth/providers/github.d.ts.map +0 -1
- package/dist/server/oauth/providers/github.js +0 -225
- package/dist/server/oauth/providers/github.js.map +0 -1
- package/dist/server/oauth/providers/google.d.ts +0 -49
- package/dist/server/oauth/providers/google.d.ts.map +0 -1
- package/dist/server/oauth/providers/google.js +0 -153
- package/dist/server/oauth/providers/google.js.map +0 -1
- package/dist/server/oauth/providers/index.d.ts +0 -9
- package/dist/server/oauth/providers/index.d.ts.map +0 -1
- package/dist/server/oauth/providers/index.js +0 -24
- package/dist/server/oauth/providers/index.js.map +0 -1
- package/dist/server/oauth/refreshTokenRotation.d.ts +0 -114
- package/dist/server/oauth/refreshTokenRotation.d.ts.map +0 -1
- package/dist/server/oauth/refreshTokenRotation.js +0 -344
- package/dist/server/oauth/refreshTokenRotation.js.map +0 -1
- package/dist/server/oauth/security.d.ts +0 -101
- package/dist/server/oauth/security.d.ts.map +0 -1
- package/dist/server/oauth/security.js +0 -268
- package/dist/server/oauth/security.js.map +0 -1
- package/dist/server/oauth/tokenEncryption.d.ts +0 -80
- package/dist/server/oauth/tokenEncryption.d.ts.map +0 -1
- package/dist/server/oauth/tokenEncryption.js +0 -218
- package/dist/server/oauth/tokenEncryption.js.map +0 -1
- package/dist/tools/sendMessage-complex-backup.d.ts +0 -6
- package/dist/tools/sendMessage-complex-backup.d.ts.map +0 -1
- package/dist/tools/sendMessage-complex-backup.js +0 -545
- package/dist/tools/sendMessage-complex-backup.js.map +0 -1
- package/dist/tools/sendMessage-revised.d.ts +0 -11
- package/dist/tools/sendMessage-revised.d.ts.map +0 -1
- package/dist/tools/sendMessage-revised.js +0 -429
- package/dist/tools/sendMessage-revised.js.map +0 -1
- package/dist/tools/sendMessage-truly-simple.d.ts +0 -8
- package/dist/tools/sendMessage-truly-simple.d.ts.map +0 -1
- package/dist/tools/sendMessage-truly-simple.js +0 -299
- package/dist/tools/sendMessage-truly-simple.js.map +0 -1
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package Blocker - Intercepts and blocks AI package recommendations
|
|
3
|
+
* This is the enforcement layer that prevents bad packages from being installed
|
|
4
|
+
*/
|
|
5
|
+
import { PackageEvaluator } from '../evaluators/package-evaluator.js';
|
|
6
|
+
export class PackageBlocker {
|
|
7
|
+
evaluator;
|
|
8
|
+
autoFix;
|
|
9
|
+
constructor(autoFix = true) {
|
|
10
|
+
this.evaluator = new PackageEvaluator();
|
|
11
|
+
this.autoFix = autoFix;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Intercept and validate code with package installations
|
|
15
|
+
*/
|
|
16
|
+
async interceptCode(code, language) {
|
|
17
|
+
const context = { language };
|
|
18
|
+
const result = {
|
|
19
|
+
allowed: true,
|
|
20
|
+
original: code,
|
|
21
|
+
warnings: [],
|
|
22
|
+
blockedPackages: [],
|
|
23
|
+
suggestions: {}
|
|
24
|
+
};
|
|
25
|
+
// Extract packages from code
|
|
26
|
+
const packages = this.evaluator.extractPackages(code, language);
|
|
27
|
+
if (packages.length === 0) {
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
// Evaluate all packages
|
|
31
|
+
const evaluations = await this.evaluator.evaluateBatch(packages, context);
|
|
32
|
+
// Process evaluation results
|
|
33
|
+
let modifiedCode = code;
|
|
34
|
+
for (const evaluation of evaluations) {
|
|
35
|
+
if (evaluation.blocked) {
|
|
36
|
+
result.allowed = false;
|
|
37
|
+
result.blockedPackages.push(evaluation.package.name);
|
|
38
|
+
if (evaluation.warning) {
|
|
39
|
+
result.warnings.push(evaluation.warning);
|
|
40
|
+
}
|
|
41
|
+
if (evaluation.suggestions && evaluation.suggestions.length > 0) {
|
|
42
|
+
result.suggestions[evaluation.package.name] = evaluation.suggestions;
|
|
43
|
+
// Auto-fix if enabled and we have a clear suggestion
|
|
44
|
+
if (this.autoFix && evaluation.suggestions.length === 1) {
|
|
45
|
+
if (evaluation.suggestions[0]) {
|
|
46
|
+
modifiedCode = this.replacePackage(modifiedCode, evaluation.package.name, evaluation.suggestions[0], language);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (evaluation.warning) {
|
|
52
|
+
result.warnings.push(evaluation.warning);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// If we modified the code, include it
|
|
56
|
+
if (modifiedCode !== code) {
|
|
57
|
+
result.modified = modifiedCode;
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Intercept package manager commands (npm install, pip install, etc.)
|
|
63
|
+
*/
|
|
64
|
+
async interceptCommand(command) {
|
|
65
|
+
const result = {
|
|
66
|
+
allowed: true,
|
|
67
|
+
original: command,
|
|
68
|
+
warnings: [],
|
|
69
|
+
blockedPackages: [],
|
|
70
|
+
suggestions: {}
|
|
71
|
+
};
|
|
72
|
+
// Detect package manager and extract packages
|
|
73
|
+
const { manager, packages, language } = this.parseCommand(command);
|
|
74
|
+
if (!manager || packages.length === 0) {
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
const context = { language };
|
|
78
|
+
// Evaluate each package
|
|
79
|
+
for (const pkg of packages) {
|
|
80
|
+
const evaluation = await this.evaluator.evaluate(pkg.name, context, pkg.version);
|
|
81
|
+
if (evaluation.blocked) {
|
|
82
|
+
result.allowed = false;
|
|
83
|
+
result.blockedPackages.push(pkg.name);
|
|
84
|
+
if (evaluation.warning) {
|
|
85
|
+
result.warnings.push(evaluation.warning);
|
|
86
|
+
}
|
|
87
|
+
if (evaluation.suggestions) {
|
|
88
|
+
result.suggestions[pkg.name] = evaluation.suggestions;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (evaluation.warning) {
|
|
92
|
+
result.warnings.push(evaluation.warning);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Generate modified command if blocked
|
|
96
|
+
if (!result.allowed && this.autoFix) {
|
|
97
|
+
const validPackages = packages.filter(pkg => !result.blockedPackages.includes(pkg.name));
|
|
98
|
+
if (validPackages.length > 0) {
|
|
99
|
+
result.modified = this.buildCommand(manager, validPackages);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
parseCommand(command) {
|
|
105
|
+
const result = {
|
|
106
|
+
manager: null,
|
|
107
|
+
packages: [],
|
|
108
|
+
language: 'unknown'
|
|
109
|
+
};
|
|
110
|
+
// npm/yarn/pnpm patterns
|
|
111
|
+
const npmMatch = command.match(/^(npm|yarn|pnpm)\s+(install|add|i)\s+(.+)$/i);
|
|
112
|
+
if (npmMatch) {
|
|
113
|
+
result.manager = npmMatch[1] || null;
|
|
114
|
+
result.language = 'javascript';
|
|
115
|
+
const packageStrings = (npmMatch[3] || '').split(/\s+/);
|
|
116
|
+
for (const pkgStr of packageStrings) {
|
|
117
|
+
if (pkgStr.startsWith('-'))
|
|
118
|
+
continue; // Skip flags
|
|
119
|
+
const [name, version] = pkgStr.split('@').filter(Boolean);
|
|
120
|
+
if (name) {
|
|
121
|
+
result.packages.push({ name, version });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
// pip patterns
|
|
127
|
+
const pipMatch = command.match(/^pip3?\s+install\s+(.+)$/i);
|
|
128
|
+
if (pipMatch) {
|
|
129
|
+
result.manager = 'pip';
|
|
130
|
+
result.language = 'python';
|
|
131
|
+
const packageStrings = (pipMatch[1] || '').split(/\s+/);
|
|
132
|
+
for (const pkgStr of packageStrings) {
|
|
133
|
+
if (pkgStr.startsWith('-'))
|
|
134
|
+
continue; // Skip flags
|
|
135
|
+
const [name, version] = pkgStr.split('==');
|
|
136
|
+
if (name) {
|
|
137
|
+
result.packages.push({ name, version });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
// Maven patterns (in pom.xml context)
|
|
143
|
+
const mvnMatch = command.match(/mvn\s+dependency:get\s+-Dartifact=(.+)/i);
|
|
144
|
+
if (mvnMatch) {
|
|
145
|
+
result.manager = 'mvn';
|
|
146
|
+
result.language = 'java';
|
|
147
|
+
const [groupId, artifactId, version] = (mvnMatch[1] || '').split(':');
|
|
148
|
+
if (groupId && artifactId) {
|
|
149
|
+
result.packages.push({
|
|
150
|
+
name: `${groupId}:${artifactId}`,
|
|
151
|
+
version
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
buildCommand(manager, packages) {
|
|
159
|
+
const packageStrings = packages.map(pkg => pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name);
|
|
160
|
+
switch (manager) {
|
|
161
|
+
case 'npm':
|
|
162
|
+
return `npm install ${packageStrings.join(' ')}`;
|
|
163
|
+
case 'yarn':
|
|
164
|
+
return `yarn add ${packageStrings.join(' ')}`;
|
|
165
|
+
case 'pnpm':
|
|
166
|
+
return `pnpm add ${packageStrings.join(' ')}`;
|
|
167
|
+
case 'pip':
|
|
168
|
+
return `pip install ${packageStrings.join(' ')}`;
|
|
169
|
+
default:
|
|
170
|
+
return '';
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
replacePackage(code, oldPkg, newPkg, language) {
|
|
174
|
+
switch (language) {
|
|
175
|
+
case 'javascript':
|
|
176
|
+
case 'typescript':
|
|
177
|
+
// Replace in import statements
|
|
178
|
+
code = code.replace(new RegExp(`(import\\s+.*?\\s+from\\s+['"])${oldPkg}(['"])`, 'g'), `$1${newPkg}$2`);
|
|
179
|
+
// Replace in require statements
|
|
180
|
+
code = code.replace(new RegExp(`(require\\s*\\(\\s*['"])${oldPkg}(['"]\\s*\\))`, 'g'), `$1${newPkg}$2`);
|
|
181
|
+
break;
|
|
182
|
+
case 'python':
|
|
183
|
+
// Replace in import statements
|
|
184
|
+
code = code.replace(new RegExp(`(^|\\n)(\\s*import\\s+)${oldPkg}(\\s|$)`, 'gm'), `$1$2${newPkg}$3`);
|
|
185
|
+
// Replace in from...import statements
|
|
186
|
+
code = code.replace(new RegExp(`(^|\\n)(\\s*from\\s+)${oldPkg}(\\s+import)`, 'gm'), `$1$2${newPkg}$3`);
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
return code;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Generate a report of blocked packages
|
|
193
|
+
*/
|
|
194
|
+
generateReport(results) {
|
|
195
|
+
const totalBlocked = results.reduce((sum, r) => sum + r.blockedPackages.length, 0);
|
|
196
|
+
const report = [
|
|
197
|
+
`Package Validation Report`,
|
|
198
|
+
`========================`,
|
|
199
|
+
`Total commands analyzed: ${results.length}`,
|
|
200
|
+
`Blocked packages: ${totalBlocked}`,
|
|
201
|
+
``
|
|
202
|
+
];
|
|
203
|
+
if (totalBlocked > 0) {
|
|
204
|
+
report.push(`Blocked Packages:`);
|
|
205
|
+
for (const result of results) {
|
|
206
|
+
for (const pkg of result.blockedPackages) {
|
|
207
|
+
const suggestions = result.suggestions[pkg];
|
|
208
|
+
report.push(` ❌ ${pkg}`);
|
|
209
|
+
if (suggestions && suggestions.length > 0) {
|
|
210
|
+
report.push(` Suggestions: ${suggestions.join(', ')}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const warnings = results.flatMap(r => r.warnings);
|
|
216
|
+
if (warnings.length > 0) {
|
|
217
|
+
report.push(``);
|
|
218
|
+
report.push(`Warnings:`);
|
|
219
|
+
warnings.forEach(w => report.push(` ⚠️ ${w}`));
|
|
220
|
+
}
|
|
221
|
+
return report.join('\n');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=package-blocker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-blocker.js","sourceRoot":"","sources":["../../../src/developer/blockers/package-blocker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Error Preventer
|
|
3
|
+
* Intercepts and prevents common AI coding errors before they cause problems
|
|
4
|
+
*/
|
|
5
|
+
import { AIErrorPattern } from '../types/ai-errors.js';
|
|
6
|
+
import { BuildContext } from './build-context-detector.js';
|
|
7
|
+
export interface ErrorPreventionResult {
|
|
8
|
+
code: string;
|
|
9
|
+
errors: Array<{
|
|
10
|
+
pattern: AIErrorPattern;
|
|
11
|
+
locations: Array<{
|
|
12
|
+
line: number;
|
|
13
|
+
column: number;
|
|
14
|
+
snippet: string;
|
|
15
|
+
}>;
|
|
16
|
+
fixed: boolean;
|
|
17
|
+
suggestion?: string;
|
|
18
|
+
}>;
|
|
19
|
+
warnings: string[];
|
|
20
|
+
fixed: boolean;
|
|
21
|
+
fixedCode?: string;
|
|
22
|
+
preventedErrors: string[];
|
|
23
|
+
buildContext?: BuildContext;
|
|
24
|
+
}
|
|
25
|
+
export declare class AIErrorPreventer {
|
|
26
|
+
private buildDetector;
|
|
27
|
+
private packageEvaluator;
|
|
28
|
+
constructor(projectRoot?: string);
|
|
29
|
+
/**
|
|
30
|
+
* Prevent AI errors in generated code
|
|
31
|
+
*/
|
|
32
|
+
preventErrors(code: string, language: string, options?: {
|
|
33
|
+
autoFix?: boolean;
|
|
34
|
+
checkBuildContext?: boolean;
|
|
35
|
+
patterns?: string[];
|
|
36
|
+
}): Promise<ErrorPreventionResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Detect a specific error pattern in code
|
|
39
|
+
*/
|
|
40
|
+
private detectPattern;
|
|
41
|
+
/**
|
|
42
|
+
* Fix a specific error pattern
|
|
43
|
+
*/
|
|
44
|
+
private fixPattern;
|
|
45
|
+
/**
|
|
46
|
+
* Fix import statements to add .js extensions for ESM
|
|
47
|
+
*/
|
|
48
|
+
private fixImportExtensions;
|
|
49
|
+
/**
|
|
50
|
+
* Generate report of prevented errors
|
|
51
|
+
*/
|
|
52
|
+
generateReport(result: ErrorPreventionResult): string;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=ai-error-preventer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-error-preventer.d.ts","sourceRoot":"","sources":["../../../src/developer/evaluators/ai-error-preventer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoB,cAAc,EAAqB,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAwB,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGjF,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,CAAC;QACZ,OAAO,EAAE,cAAc,CAAC;QACxB,SAAS,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACpE,KAAK,EAAE,OAAO,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,WAAW,CAAC,EAAE,MAAM;IAKhC;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QACP,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KAChB,GACL,OAAO,CAAC,qBAAqB,CAAC;IAuFjC;;OAEG;YACW,aAAa;IAgG3B;;OAEG;YACW,UAAU;IAiDxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM;CAwDtD"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Error Preventer
|
|
3
|
+
* Intercepts and prevents common AI coding errors before they cause problems
|
|
4
|
+
*/
|
|
5
|
+
import { AI_ERROR_CATALOG, getCriticalErrors } from '../types/ai-errors.js';
|
|
6
|
+
import { BuildContextDetector } from './build-context-detector.js';
|
|
7
|
+
import { PackageEvaluator } from './package-evaluator.js';
|
|
8
|
+
export class AIErrorPreventer {
|
|
9
|
+
buildDetector;
|
|
10
|
+
packageEvaluator;
|
|
11
|
+
constructor(projectRoot) {
|
|
12
|
+
this.buildDetector = new BuildContextDetector(projectRoot);
|
|
13
|
+
this.packageEvaluator = new PackageEvaluator();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Prevent AI errors in generated code
|
|
17
|
+
*/
|
|
18
|
+
async preventErrors(code, language, options = {}) {
|
|
19
|
+
const result = {
|
|
20
|
+
code,
|
|
21
|
+
errors: [],
|
|
22
|
+
warnings: [],
|
|
23
|
+
fixed: false,
|
|
24
|
+
preventedErrors: []
|
|
25
|
+
};
|
|
26
|
+
// Step 1: Detect build context if requested
|
|
27
|
+
if (options.checkBuildContext) {
|
|
28
|
+
result.buildContext = await this.buildDetector.detect();
|
|
29
|
+
// Apply build context fixes
|
|
30
|
+
if (result.buildContext.requiresJsExtensions) {
|
|
31
|
+
code = this.fixImportExtensions(code, language);
|
|
32
|
+
result.preventedErrors.push('build-context-blindness');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Step 2: Check for critical error patterns
|
|
36
|
+
const patternsToCheck = options.patterns
|
|
37
|
+
? AI_ERROR_CATALOG.filter(p => options.patterns?.includes(p.id) || false)
|
|
38
|
+
: getCriticalErrors();
|
|
39
|
+
for (const pattern of patternsToCheck) {
|
|
40
|
+
const detection = await this.detectPattern(code, pattern, language);
|
|
41
|
+
if (detection.found) {
|
|
42
|
+
result.errors.push({
|
|
43
|
+
pattern,
|
|
44
|
+
locations: detection.locations,
|
|
45
|
+
fixed: false,
|
|
46
|
+
suggestion: detection.suggestion
|
|
47
|
+
});
|
|
48
|
+
if (options.autoFix === true && pattern.autoFixable) {
|
|
49
|
+
const fixedCode = await this.fixPattern(code, pattern, language);
|
|
50
|
+
if (fixedCode !== code) {
|
|
51
|
+
code = fixedCode;
|
|
52
|
+
const lastError = result.errors[result.errors.length - 1];
|
|
53
|
+
if (lastError) {
|
|
54
|
+
lastError.fixed = true;
|
|
55
|
+
}
|
|
56
|
+
result.preventedErrors.push(pattern.id);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Step 3: Package validation (always check)
|
|
62
|
+
const languageWithTs = language;
|
|
63
|
+
const packages = this.packageEvaluator.extractPackages(code, languageWithTs);
|
|
64
|
+
if (packages.length > 0) {
|
|
65
|
+
const validationResults = await this.packageEvaluator.evaluateBatch(packages, { language: languageWithTs });
|
|
66
|
+
const invalidPackages = validationResults.filter(r => r.blocked);
|
|
67
|
+
if (invalidPackages.length > 0) {
|
|
68
|
+
result.warnings.push(`Found ${invalidPackages.length} invalid packages`);
|
|
69
|
+
result.preventedErrors.push('package-hallucination');
|
|
70
|
+
// Auto-fix package names if possible
|
|
71
|
+
if (options.autoFix === true) {
|
|
72
|
+
for (const pkg of invalidPackages) {
|
|
73
|
+
if (pkg.suggestions && pkg.suggestions.length === 1) {
|
|
74
|
+
code = code.replace(new RegExp(`(['"])${pkg.package.name}(['"])`, 'g'), `$1${pkg.suggestions[0]}$2`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Return final result
|
|
81
|
+
if (code !== result.code) {
|
|
82
|
+
result.fixed = true;
|
|
83
|
+
result.fixedCode = code;
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Detect a specific error pattern in code
|
|
89
|
+
*/
|
|
90
|
+
async detectPattern(code, pattern, _language) {
|
|
91
|
+
const locations = [];
|
|
92
|
+
switch (pattern.id) {
|
|
93
|
+
case 'async-await-confusion': {
|
|
94
|
+
// Look for Promise-returning functions without await
|
|
95
|
+
const lines = code.split('\n');
|
|
96
|
+
lines.forEach((line, index) => {
|
|
97
|
+
if (line.includes('fetch(') || line.includes('axios') || line.includes('query')) {
|
|
98
|
+
if (!line.includes('await') && !line.includes('.then')) {
|
|
99
|
+
locations.push({
|
|
100
|
+
line: index + 1,
|
|
101
|
+
column: line.indexOf('fetch') || line.indexOf('axios') || 0,
|
|
102
|
+
snippet: line.trim()
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case 'sql-injection-prone': {
|
|
110
|
+
// Check for string concatenation in SQL queries
|
|
111
|
+
const sqlPattern = /(?:query|execute|prepare)\s*\(\s*[`'"].*?\$\{.*?\}|(?:query|execute|prepare)\s*\(\s*.*?\+/gi;
|
|
112
|
+
let match;
|
|
113
|
+
while ((match = sqlPattern.exec(code)) !== null) {
|
|
114
|
+
const line = code.substring(0, match.index).split('\n').length;
|
|
115
|
+
locations.push({
|
|
116
|
+
line,
|
|
117
|
+
column: match.index,
|
|
118
|
+
snippet: match[0]
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
case 'hardcoded-secrets': {
|
|
124
|
+
// Detect common secret patterns
|
|
125
|
+
const secretPatterns = [
|
|
126
|
+
/(?:api[_-]?key|apikey|secret|password|token)\s*[:=]\s*['"][^'"]{10,}['"]/gi,
|
|
127
|
+
/sk-[a-zA-Z0-9]{20,}/g,
|
|
128
|
+
/mongodb:\/\/[^:]+:[^@]+@/g
|
|
129
|
+
];
|
|
130
|
+
for (const secretPattern of secretPatterns) {
|
|
131
|
+
let match;
|
|
132
|
+
while ((match = secretPattern.exec(code)) !== null) {
|
|
133
|
+
const line = code.substring(0, match.index).split('\n').length;
|
|
134
|
+
locations.push({
|
|
135
|
+
line,
|
|
136
|
+
column: match.index,
|
|
137
|
+
snippet: match[0]
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
case 'null-reference-error': {
|
|
144
|
+
// Look for property access chains without null checks
|
|
145
|
+
const chainPattern = /\b\w+(?:\.\w+){2,}/g;
|
|
146
|
+
let chainMatch;
|
|
147
|
+
while ((chainMatch = chainPattern.exec(code)) !== null) {
|
|
148
|
+
const chain = chainMatch[0];
|
|
149
|
+
// Check if there's optional chaining or null check nearby
|
|
150
|
+
const lineStart = code.lastIndexOf('\n', chainMatch.index) + 1;
|
|
151
|
+
const lineEnd = code.indexOf('\n', chainMatch.index);
|
|
152
|
+
const line = code.substring(lineStart, lineEnd === -1 ? undefined : lineEnd);
|
|
153
|
+
if (!line.includes('?.') && !line.includes('if (') && !line.includes('&& ')) {
|
|
154
|
+
locations.push({
|
|
155
|
+
line: code.substring(0, chainMatch.index).split('\n').length,
|
|
156
|
+
column: chainMatch.index - lineStart,
|
|
157
|
+
snippet: chain
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
found: locations.length > 0,
|
|
166
|
+
locations,
|
|
167
|
+
suggestion: pattern.prevention
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Fix a specific error pattern
|
|
172
|
+
*/
|
|
173
|
+
async fixPattern(code, pattern, _language) {
|
|
174
|
+
switch (pattern.id) {
|
|
175
|
+
case 'async-await-confusion':
|
|
176
|
+
// Add await to common async functions
|
|
177
|
+
code = code.replace(/(\s+)(fetch\()/g, '$1await $2');
|
|
178
|
+
code = code.replace(/(\s+)(axios\.\w+\()/g, '$1await $2');
|
|
179
|
+
break;
|
|
180
|
+
case 'sql-injection-prone':
|
|
181
|
+
// Convert to parameterized queries (basic example)
|
|
182
|
+
code = code.replace(/query\(`SELECT \* FROM (\w+) WHERE (\w+) = \$\{([^}]+)\}`\)/g, 'query("SELECT * FROM $1 WHERE $2 = ?", [$3])');
|
|
183
|
+
break;
|
|
184
|
+
case 'hardcoded-secrets':
|
|
185
|
+
// Replace with environment variables
|
|
186
|
+
code = code.replace(/(?:const|let|var)\s+(\w*(?:api[_-]?key|apikey|secret|password|token)\w*)\s*=\s*['"]([^'"]+)['"]/gi, 'const $1 = process.env.$1');
|
|
187
|
+
break;
|
|
188
|
+
case 'null-reference-error':
|
|
189
|
+
// Add optional chaining
|
|
190
|
+
code = code.replace(/(\b\w+)((?:\.\w+){2,})/g, (match, obj, chain) => {
|
|
191
|
+
// Don't modify if it's already using optional chaining
|
|
192
|
+
if (code[code.indexOf(match) - 1] === '?')
|
|
193
|
+
return match;
|
|
194
|
+
// Convert to optional chaining
|
|
195
|
+
return obj + chain.replace(/\./g, '?.');
|
|
196
|
+
});
|
|
197
|
+
break;
|
|
198
|
+
case 'build-context-blindness':
|
|
199
|
+
// This is handled by fixImportExtensions
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
return code;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Fix import statements to add .js extensions for ESM
|
|
206
|
+
*/
|
|
207
|
+
fixImportExtensions(code, language) {
|
|
208
|
+
if (language !== 'javascript' && language !== 'typescript') {
|
|
209
|
+
return code;
|
|
210
|
+
}
|
|
211
|
+
// Fix import statements
|
|
212
|
+
code = code.replace(/from\s+['"](\.[^'"]+?)(?<!\.js|\.mjs|\.json|\.node)['"](\s|;|$)/g, 'from "$1.js"$2');
|
|
213
|
+
// Fix dynamic imports
|
|
214
|
+
code = code.replace(/import\s*\(\s*['"](\.[^'"]+?)(?<!\.js|\.mjs|\.json|\.node)['"]\s*\)/g, 'import("$1.js")');
|
|
215
|
+
return code;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Generate report of prevented errors
|
|
219
|
+
*/
|
|
220
|
+
generateReport(result) {
|
|
221
|
+
const lines = [
|
|
222
|
+
'🛡️ AI Error Prevention Report',
|
|
223
|
+
'='.repeat(40),
|
|
224
|
+
''
|
|
225
|
+
];
|
|
226
|
+
if (result.buildContext) {
|
|
227
|
+
lines.push('📦 Build Context:');
|
|
228
|
+
lines.push(` Language: ${result.buildContext.language}`);
|
|
229
|
+
lines.push(` Module System: ${result.buildContext.moduleSystem || 'unknown'}`);
|
|
230
|
+
lines.push(` Package Manager: ${result.buildContext.packageManager || 'unknown'}`);
|
|
231
|
+
if (result.buildContext.requiresJsExtensions) {
|
|
232
|
+
lines.push(' ⚠️ Requires .js extensions in imports');
|
|
233
|
+
}
|
|
234
|
+
lines.push('');
|
|
235
|
+
}
|
|
236
|
+
if (result.preventedErrors.length > 0) {
|
|
237
|
+
lines.push(`✅ Prevented ${result.preventedErrors.length} AI Errors:`);
|
|
238
|
+
for (const errorId of result.preventedErrors) {
|
|
239
|
+
const pattern = AI_ERROR_CATALOG.find(p => p.id === errorId);
|
|
240
|
+
if (pattern) {
|
|
241
|
+
lines.push(` • ${pattern.name} (${pattern.impact} impact)`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
lines.push('');
|
|
245
|
+
}
|
|
246
|
+
if (result.errors.length > 0) {
|
|
247
|
+
const unfixed = result.errors.filter(e => !e.fixed);
|
|
248
|
+
if (unfixed.length > 0) {
|
|
249
|
+
lines.push(`⚠️ ${unfixed.length} Issues Need Manual Review:`);
|
|
250
|
+
for (const error of unfixed) {
|
|
251
|
+
lines.push(` • ${error.pattern.name}`);
|
|
252
|
+
if (error.suggestion) {
|
|
253
|
+
lines.push(` Fix: ${error.suggestion}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (result.warnings.length > 0) {
|
|
259
|
+
lines.push('');
|
|
260
|
+
lines.push('📝 Warnings:');
|
|
261
|
+
result.warnings.forEach(w => lines.push(` • ${w}`));
|
|
262
|
+
}
|
|
263
|
+
lines.push('');
|
|
264
|
+
lines.push('-'.repeat(40));
|
|
265
|
+
lines.push(`Total Errors Prevented: ${result.preventedErrors.length}`);
|
|
266
|
+
lines.push(`Code Modified: ${result.fixed ? 'Yes' : 'No'}`);
|
|
267
|
+
return lines.join('\n');
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=ai-error-preventer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-error-preventer.js","sourceRoot":"","sources":["../../../src/developer/evaluators/ai-error-preventer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build Context Detector - Prevents "Build Context Blindness" errors
|
|
3
|
+
* Detects project configuration to prevent AI agents from making incorrect assumptions
|
|
4
|
+
*/
|
|
5
|
+
export interface BuildContext {
|
|
6
|
+
language: 'javascript' | 'typescript' | 'python' | 'java' | 'unknown';
|
|
7
|
+
moduleSystem?: 'commonjs' | 'esm' | 'umd' | 'amd';
|
|
8
|
+
packageManager?: 'npm' | 'yarn' | 'pnpm' | 'pip' | 'maven' | 'gradle';
|
|
9
|
+
buildTool?: string;
|
|
10
|
+
tsConfig?: {
|
|
11
|
+
moduleResolution?: string;
|
|
12
|
+
module?: string;
|
|
13
|
+
target?: string;
|
|
14
|
+
strict?: boolean;
|
|
15
|
+
esModuleInterop?: boolean;
|
|
16
|
+
};
|
|
17
|
+
pythonVersion?: string;
|
|
18
|
+
nodeVersion?: string;
|
|
19
|
+
hasTypeScript: boolean;
|
|
20
|
+
requiresJsExtensions: boolean;
|
|
21
|
+
errors: string[];
|
|
22
|
+
warnings: string[];
|
|
23
|
+
aiGuidance: string[];
|
|
24
|
+
}
|
|
25
|
+
export declare class BuildContextDetector {
|
|
26
|
+
private projectRoot;
|
|
27
|
+
constructor(projectRoot?: string);
|
|
28
|
+
/**
|
|
29
|
+
* Detect full build context to prevent AI errors
|
|
30
|
+
*/
|
|
31
|
+
detect(): Promise<BuildContext>;
|
|
32
|
+
private detectNodeContext;
|
|
33
|
+
private detectTypeScriptContext;
|
|
34
|
+
private detectPythonContext;
|
|
35
|
+
private detectJavaContext;
|
|
36
|
+
private generateAIGuidance;
|
|
37
|
+
private fileExists;
|
|
38
|
+
private findFirstExisting;
|
|
39
|
+
/**
|
|
40
|
+
* Generate a build command based on detected context
|
|
41
|
+
*/
|
|
42
|
+
generateBuildCommand(context: BuildContext): string;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=build-context-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-context-detector.d.ts","sourceRoot":"","sources":["../../../src/developer/evaluators/build-context-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IACtE,YAAY,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAClD,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QACT,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,GAAE,MAAsB;IAI/C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;YA4BvB,iBAAiB;YA4DjB,uBAAuB;YA0CvB,mBAAmB;YAqCnB,iBAAiB;IAuB/B,OAAO,CAAC,kBAAkB;YAiCZ,UAAU;YASV,iBAAiB;IAS/B;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;CAkBpD"}
|