vaspera 2.10.0 → 2.11.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/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.js +188 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js +363 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js +226 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/index.test.js +214 -0
- package/dist/__tests__/scanners/ai-code/index.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.js +67 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/index.test.js +84 -0
- package/dist/__tests__/scanners/deploy/index.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.js +88 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/types.test.js +126 -0
- package/dist/__tests__/scanners/deploy/types.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-feedback.test.js +1 -1
- package/dist/__tests__/scanners/fp-feedback.test.js.map +1 -1
- package/dist/__tests__/scanners/fp-tracker.test.js +1 -1
- package/dist/__tests__/scanners/fp-tracker.test.js.map +1 -1
- package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.js +94 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.js +195 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/index.test.js +120 -0
- package/dist/__tests__/scanners/runtime/index.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/types.test.js +126 -0
- package/dist/__tests__/scanners/runtime/types.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.js +187 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/index.test.js +87 -0
- package/dist/__tests__/scanners/scale/index.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.js +122 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/types.test.js +129 -0
- package/dist/__tests__/scanners/scale/types.test.js.map +1 -0
- package/dist/action/pr-comment.test.js +8 -0
- package/dist/action/pr-comment.test.js.map +1 -1
- package/dist/action/sarif-upload.test.js +8 -0
- package/dist/action/sarif-upload.test.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +874 -0
- package/dist/index.js.map +1 -1
- package/dist/install-skills.d.ts +11 -0
- package/dist/install-skills.d.ts.map +1 -0
- package/dist/install-skills.js +81 -0
- package/dist/install-skills.js.map +1 -0
- package/dist/scanners/ai-code/ai-detector.d.ts +25 -0
- package/dist/scanners/ai-code/ai-detector.d.ts.map +1 -0
- package/dist/scanners/ai-code/ai-detector.js +192 -0
- package/dist/scanners/ai-code/ai-detector.js.map +1 -0
- package/dist/scanners/ai-code/confidence-scorer.d.ts +40 -0
- package/dist/scanners/ai-code/confidence-scorer.d.ts.map +1 -0
- package/dist/scanners/ai-code/confidence-scorer.js +148 -0
- package/dist/scanners/ai-code/confidence-scorer.js.map +1 -0
- package/dist/scanners/ai-code/hallucination-checker.d.ts +36 -0
- package/dist/scanners/ai-code/hallucination-checker.d.ts.map +1 -0
- package/dist/scanners/ai-code/hallucination-checker.js +298 -0
- package/dist/scanners/ai-code/hallucination-checker.js.map +1 -0
- package/dist/scanners/ai-code/index.d.ts +30 -0
- package/dist/scanners/ai-code/index.d.ts.map +1 -0
- package/dist/scanners/ai-code/index.js +224 -0
- package/dist/scanners/ai-code/index.js.map +1 -0
- package/dist/scanners/ai-code/types.d.ts +192 -0
- package/dist/scanners/ai-code/types.d.ts.map +1 -0
- package/dist/scanners/ai-code/types.js +37 -0
- package/dist/scanners/ai-code/types.js.map +1 -0
- package/dist/scanners/cache.d.ts.map +1 -1
- package/dist/scanners/cache.js +8 -0
- package/dist/scanners/cache.js.map +1 -1
- package/dist/scanners/dast.d.ts +40 -0
- package/dist/scanners/dast.d.ts.map +1 -0
- package/dist/scanners/dast.js +228 -0
- package/dist/scanners/dast.js.map +1 -0
- package/dist/scanners/deploy/health-checker.d.ts +38 -0
- package/dist/scanners/deploy/health-checker.d.ts.map +1 -0
- package/dist/scanners/deploy/health-checker.js +272 -0
- package/dist/scanners/deploy/health-checker.js.map +1 -0
- package/dist/scanners/deploy/index.d.ts +44 -0
- package/dist/scanners/deploy/index.d.ts.map +1 -0
- package/dist/scanners/deploy/index.js +208 -0
- package/dist/scanners/deploy/index.js.map +1 -0
- package/dist/scanners/deploy/provider-detector.d.ts +25 -0
- package/dist/scanners/deploy/provider-detector.d.ts.map +1 -0
- package/dist/scanners/deploy/provider-detector.js +177 -0
- package/dist/scanners/deploy/provider-detector.js.map +1 -0
- package/dist/scanners/deploy/types.d.ts +406 -0
- package/dist/scanners/deploy/types.d.ts.map +1 -0
- package/dist/scanners/deploy/types.js +58 -0
- package/dist/scanners/deploy/types.js.map +1 -0
- package/dist/scanners/deploy/vercel-integration.d.ts +52 -0
- package/dist/scanners/deploy/vercel-integration.d.ts.map +1 -0
- package/dist/scanners/deploy/vercel-integration.js +280 -0
- package/dist/scanners/deploy/vercel-integration.js.map +1 -0
- package/dist/scanners/index.d.ts +4 -4
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +133 -15
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/index.test.js +6 -6
- package/dist/scanners/index.test.js.map +1 -1
- package/dist/scanners/openapi.d.ts +20 -0
- package/dist/scanners/openapi.d.ts.map +1 -0
- package/dist/scanners/openapi.js +226 -0
- package/dist/scanners/openapi.js.map +1 -0
- package/dist/scanners/runtime/app-launcher.d.ts +33 -0
- package/dist/scanners/runtime/app-launcher.d.ts.map +1 -0
- package/dist/scanners/runtime/app-launcher.js +419 -0
- package/dist/scanners/runtime/app-launcher.js.map +1 -0
- package/dist/scanners/runtime/golden-path-runner.d.ts +48 -0
- package/dist/scanners/runtime/golden-path-runner.d.ts.map +1 -0
- package/dist/scanners/runtime/golden-path-runner.js +373 -0
- package/dist/scanners/runtime/golden-path-runner.js.map +1 -0
- package/dist/scanners/runtime/index.d.ts +41 -0
- package/dist/scanners/runtime/index.d.ts.map +1 -0
- package/dist/scanners/runtime/index.js +164 -0
- package/dist/scanners/runtime/index.js.map +1 -0
- package/dist/scanners/runtime/playwright-executor.d.ts +50 -0
- package/dist/scanners/runtime/playwright-executor.d.ts.map +1 -0
- package/dist/scanners/runtime/playwright-executor.js +387 -0
- package/dist/scanners/runtime/playwright-executor.js.map +1 -0
- package/dist/scanners/runtime/types.d.ts +215 -0
- package/dist/scanners/runtime/types.d.ts.map +1 -0
- package/dist/scanners/runtime/types.js +40 -0
- package/dist/scanners/runtime/types.js.map +1 -0
- package/dist/scanners/rust.d.ts +22 -0
- package/dist/scanners/rust.d.ts.map +1 -0
- package/dist/scanners/rust.js +239 -0
- package/dist/scanners/rust.js.map +1 -0
- package/dist/scanners/scale/bottleneck-detector.d.ts +17 -0
- package/dist/scanners/scale/bottleneck-detector.d.ts.map +1 -0
- package/dist/scanners/scale/bottleneck-detector.js +250 -0
- package/dist/scanners/scale/bottleneck-detector.js.map +1 -0
- package/dist/scanners/scale/capacity-estimator.d.ts +17 -0
- package/dist/scanners/scale/capacity-estimator.d.ts.map +1 -0
- package/dist/scanners/scale/capacity-estimator.js +197 -0
- package/dist/scanners/scale/capacity-estimator.js.map +1 -0
- package/dist/scanners/scale/index.d.ts +37 -0
- package/dist/scanners/scale/index.d.ts.map +1 -0
- package/dist/scanners/scale/index.js +101 -0
- package/dist/scanners/scale/index.js.map +1 -0
- package/dist/scanners/scale/load-profiler.d.ts +48 -0
- package/dist/scanners/scale/load-profiler.d.ts.map +1 -0
- package/dist/scanners/scale/load-profiler.js +377 -0
- package/dist/scanners/scale/load-profiler.js.map +1 -0
- package/dist/scanners/scale/types.d.ts +529 -0
- package/dist/scanners/scale/types.d.ts.map +1 -0
- package/dist/scanners/scale/types.js +57 -0
- package/dist/scanners/scale/types.js.map +1 -0
- package/dist/scanners/secrets.d.ts.map +1 -1
- package/dist/scanners/secrets.js +13 -2
- package/dist/scanners/secrets.js.map +1 -1
- package/dist/scanners/terraform.d.ts +23 -0
- package/dist/scanners/terraform.d.ts.map +1 -0
- package/dist/scanners/terraform.js +207 -0
- package/dist/scanners/terraform.js.map +1 -0
- package/dist/scanners/types.d.ts +1 -1
- package/dist/scanners/types.d.ts.map +1 -1
- package/dist/scanners/types.js +8 -0
- package/dist/scanners/types.js.map +1 -1
- package/package.json +4 -2
- package/skills/vaspera-add-tests/SKILL.md +102 -0
- package/skills/vaspera-ai-verify/SKILL.md +166 -0
- package/skills/vaspera-audit/SKILL.md +67 -0
- package/skills/vaspera-certify/SKILL.md +130 -0
- package/skills/vaspera-deploy/SKILL.md +152 -0
- package/skills/vaspera-fix-critical/SKILL.md +52 -0
- package/skills/vaspera-fix-high/SKILL.md +81 -0
- package/skills/vaspera-fix-medium/SKILL.md +56 -0
- package/skills/vaspera-fix-rls/SKILL.md +85 -0
- package/skills/vaspera-harden/SKILL.md +102 -0
- package/skills/vaspera-help/SKILL.md +61 -0
- package/skills/vaspera-load-test/SKILL.md +167 -0
- package/skills/vaspera-verify/SKILL.md +70 -0
- package/skills/vaspera-verify-e2e/SKILL.md +117 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skills.d.ts","sourceRoot":"","sources":["../src/install-skills.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Install Vaspera Hardening skills to ~/.claude/skills/
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx vaspera-install-skills
|
|
7
|
+
* # or after global install:
|
|
8
|
+
* vaspera-install-skills
|
|
9
|
+
*/
|
|
10
|
+
import { copyFile, mkdir, readdir, stat } from "fs/promises";
|
|
11
|
+
import { join, dirname } from "path";
|
|
12
|
+
import { homedir } from "os";
|
|
13
|
+
import { fileURLToPath } from "url";
|
|
14
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
function getSkillsSource() {
|
|
16
|
+
// When running from dist/, skills are at ../skills/
|
|
17
|
+
// When running from src/, skills are at ../skills/
|
|
18
|
+
const fromDist = join(__dirname, "..", "skills");
|
|
19
|
+
return fromDist;
|
|
20
|
+
}
|
|
21
|
+
const SKILLS_TARGET = join(homedir(), ".claude", "skills");
|
|
22
|
+
async function installSkills() {
|
|
23
|
+
console.log("🔧 Installing Vaspera Hardening skills...\n");
|
|
24
|
+
const skillsSource = getSkillsSource();
|
|
25
|
+
// Ensure target directory exists
|
|
26
|
+
await mkdir(SKILLS_TARGET, { recursive: true });
|
|
27
|
+
// Get list of skills
|
|
28
|
+
let skills;
|
|
29
|
+
try {
|
|
30
|
+
skills = await readdir(skillsSource);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
console.error(`❌ Skills directory not found at: ${skillsSource}`);
|
|
34
|
+
console.error(" Make sure the package is installed correctly.");
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
const vasperaSkills = skills.filter((s) => s.startsWith("vaspera-"));
|
|
38
|
+
if (vasperaSkills.length === 0) {
|
|
39
|
+
console.error("❌ No Vaspera skills found in package.");
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
let installed = 0;
|
|
43
|
+
let skipped = 0;
|
|
44
|
+
for (const skill of vasperaSkills) {
|
|
45
|
+
const sourceDir = join(skillsSource, skill);
|
|
46
|
+
const targetDir = join(SKILLS_TARGET, skill);
|
|
47
|
+
const sourceFile = join(sourceDir, "SKILL.md");
|
|
48
|
+
const targetFile = join(targetDir, "SKILL.md");
|
|
49
|
+
try {
|
|
50
|
+
await stat(sourceFile);
|
|
51
|
+
await mkdir(targetDir, { recursive: true });
|
|
52
|
+
await copyFile(sourceFile, targetFile);
|
|
53
|
+
console.log(` ✅ ${skill}`);
|
|
54
|
+
installed++;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error.code === "ENOENT") {
|
|
58
|
+
console.log(` ⚠️ ${skill} - source not found, skipping`);
|
|
59
|
+
skipped++;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log(` ❌ ${skill} - ${error.message}`);
|
|
63
|
+
skipped++;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
console.log(`\n📊 Summary: ${installed} installed, ${skipped} skipped`);
|
|
68
|
+
console.log(`📁 Skills installed to: ${SKILLS_TARGET}`);
|
|
69
|
+
console.log("\n🎉 Done! Skills are now available in Claude Code.");
|
|
70
|
+
console.log("\nAvailable commands:");
|
|
71
|
+
console.log(" /vaspera-help Show all Vaspera skills");
|
|
72
|
+
console.log(" /vaspera-audit Run security audit");
|
|
73
|
+
console.log(" /vaspera-harden Full hardening pipeline");
|
|
74
|
+
console.log(" /vaspera-ai-verify AI code verification");
|
|
75
|
+
console.log(" /vaspera-certify Full production readiness certification");
|
|
76
|
+
}
|
|
77
|
+
installSkills().catch((error) => {
|
|
78
|
+
console.error("Failed to install skills:", error);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=install-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skills.js","sourceRoot":"","sources":["../src/install-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Code Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects patterns that indicate AI-generated code.
|
|
5
|
+
*
|
|
6
|
+
* @module scanners/ai-code/ai-detector
|
|
7
|
+
*/
|
|
8
|
+
import type { AIIndicator, ConfidenceLevel, PatternMatch } from "./types.js";
|
|
9
|
+
export declare function detectAIPatterns(filePath: string, content?: string): Promise<PatternMatch[]>;
|
|
10
|
+
export declare function patternMatchesToIndicators(matches: PatternMatch[]): AIIndicator[];
|
|
11
|
+
export declare function scanDirectoryForAIPatterns(projectPath: string, options?: {
|
|
12
|
+
extensions?: string[];
|
|
13
|
+
exclude?: string[];
|
|
14
|
+
}): Promise<{
|
|
15
|
+
files: number;
|
|
16
|
+
matches: PatternMatch[];
|
|
17
|
+
indicators: AIIndicator[];
|
|
18
|
+
}>;
|
|
19
|
+
export declare function calculateAILikelihood(indicators: AIIndicator[]): number;
|
|
20
|
+
export declare function aggregateByFile(indicators: AIIndicator[]): Map<string, {
|
|
21
|
+
count: number;
|
|
22
|
+
maxConfidence: ConfidenceLevel;
|
|
23
|
+
likelihood: number;
|
|
24
|
+
}>;
|
|
25
|
+
//# sourceMappingURL=ai-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-detector.d.ts","sourceRoot":"","sources":["../../../src/scanners/ai-code/ai-detector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA0G7E,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,EAAE,CAAC,CAsBzB;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,YAAY,EAAE,GACtB,WAAW,EAAE,CAgBf;AAED,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACf,GACL,OAAO,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,WAAW,EAAE,CAAC;CAC3B,CAAC,CAuBD;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,CAgBvE;AAED,wBAAgB,eAAe,CAC7B,UAAU,EAAE,WAAW,EAAE,GACxB,GAAG,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BpF"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Code Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects patterns that indicate AI-generated code.
|
|
5
|
+
*
|
|
6
|
+
* @module scanners/ai-code/ai-detector
|
|
7
|
+
*/
|
|
8
|
+
import { readFile } from "fs/promises";
|
|
9
|
+
import { glob } from "glob";
|
|
10
|
+
const AI_PATTERNS = [
|
|
11
|
+
// Comment patterns indicating AI generation
|
|
12
|
+
{
|
|
13
|
+
name: "ai-comment-generated",
|
|
14
|
+
regex: /\/\/\s*(generated|created)\s*(by|with|using)\s*(ai|gpt|claude|copilot|chatgpt|openai|anthropic)/i,
|
|
15
|
+
confidence: "high",
|
|
16
|
+
type: "comment",
|
|
17
|
+
description: "Comment explicitly mentions AI generation",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "ai-comment-assistant",
|
|
21
|
+
regex: /\/\/\s*(ai|assistant|copilot)\s*suggestion/i,
|
|
22
|
+
confidence: "high",
|
|
23
|
+
type: "comment",
|
|
24
|
+
description: "Comment mentions AI assistant suggestion",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: "todo-placeholder",
|
|
28
|
+
regex: /\/\/\s*TODO:\s*(implement|add|fix)\s+(this|here|logic)/i,
|
|
29
|
+
confidence: "medium",
|
|
30
|
+
type: "comment",
|
|
31
|
+
description: "Generic TODO placeholder typical of AI generation",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: "verbose-explanation",
|
|
35
|
+
regex: /\/\/\s*This\s+(function|method|class)\s+(is\s+used\s+to|will|should)\s+.{50,}/i,
|
|
36
|
+
confidence: "medium",
|
|
37
|
+
type: "comment",
|
|
38
|
+
description: "Overly verbose explanatory comment",
|
|
39
|
+
},
|
|
40
|
+
// Structural patterns
|
|
41
|
+
{
|
|
42
|
+
name: "excessive-try-catch",
|
|
43
|
+
regex: /try\s*\{[\s\S]{10,50}\}\s*catch\s*\(\s*\w+\s*\)\s*\{\s*console\.(log|error)\(/,
|
|
44
|
+
confidence: "low",
|
|
45
|
+
type: "structure",
|
|
46
|
+
description: "Minimal try-catch with only console logging",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "redundant-async",
|
|
50
|
+
regex: /async\s+\w+\s*\([^)]*\)\s*\{[^}]*return\s+[^a]*;[^}]*\}/,
|
|
51
|
+
confidence: "low",
|
|
52
|
+
type: "structure",
|
|
53
|
+
description: "Async function without await",
|
|
54
|
+
},
|
|
55
|
+
// Naming patterns
|
|
56
|
+
{
|
|
57
|
+
name: "overly-descriptive-name",
|
|
58
|
+
regex: /const\s+\w{30,}\s*=/,
|
|
59
|
+
confidence: "low",
|
|
60
|
+
type: "naming",
|
|
61
|
+
description: "Excessively long variable name",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "generic-handler-name",
|
|
65
|
+
regex: /(const|function)\s+(handleClick|handleSubmit|handleChange|handleInput)\s*[=\(]/,
|
|
66
|
+
confidence: "low",
|
|
67
|
+
type: "naming",
|
|
68
|
+
description: "Generic event handler name",
|
|
69
|
+
},
|
|
70
|
+
// Code patterns
|
|
71
|
+
{
|
|
72
|
+
name: "repeated-null-checks",
|
|
73
|
+
regex: /(\?\.\w+){4,}/,
|
|
74
|
+
confidence: "medium",
|
|
75
|
+
type: "pattern",
|
|
76
|
+
description: "Excessive optional chaining",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "empty-implementation",
|
|
80
|
+
regex: /\{\s*(\/\/\s*TODO|throw\s+new\s+Error\s*\(\s*["']Not\s+implemented["']\s*\))\s*\}/,
|
|
81
|
+
confidence: "medium",
|
|
82
|
+
type: "pattern",
|
|
83
|
+
description: "Empty implementation placeholder",
|
|
84
|
+
},
|
|
85
|
+
// Metadata patterns
|
|
86
|
+
{
|
|
87
|
+
name: "cursor-metadata",
|
|
88
|
+
regex: /@cursor-ai|cursor:ignore|cursor-generated/i,
|
|
89
|
+
confidence: "high",
|
|
90
|
+
type: "metadata",
|
|
91
|
+
description: "Cursor AI metadata marker",
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: "copilot-metadata",
|
|
95
|
+
regex: /@copilot|copilot-ignore|copilot-generated/i,
|
|
96
|
+
confidence: "high",
|
|
97
|
+
type: "metadata",
|
|
98
|
+
description: "GitHub Copilot metadata marker",
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
export async function detectAIPatterns(filePath, content) {
|
|
102
|
+
const fileContent = content ?? (await readFile(filePath, "utf-8"));
|
|
103
|
+
const lines = fileContent.split("\n");
|
|
104
|
+
const matches = [];
|
|
105
|
+
for (let i = 0; i < lines.length; i++) {
|
|
106
|
+
const line = lines[i];
|
|
107
|
+
for (const pattern of AI_PATTERNS) {
|
|
108
|
+
const match = line.match(pattern.regex);
|
|
109
|
+
if (match) {
|
|
110
|
+
matches.push({
|
|
111
|
+
pattern: pattern.name,
|
|
112
|
+
file: filePath,
|
|
113
|
+
line: i + 1,
|
|
114
|
+
match: match[0],
|
|
115
|
+
confidence: pattern.confidence,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return matches;
|
|
121
|
+
}
|
|
122
|
+
export function patternMatchesToIndicators(matches) {
|
|
123
|
+
const patternInfo = new Map(AI_PATTERNS.map((p) => [p.name, p]));
|
|
124
|
+
return matches.map((match) => {
|
|
125
|
+
const info = patternInfo.get(match.pattern);
|
|
126
|
+
return {
|
|
127
|
+
type: info?.type ?? "pattern",
|
|
128
|
+
location: {
|
|
129
|
+
file: match.file,
|
|
130
|
+
line: match.line,
|
|
131
|
+
},
|
|
132
|
+
description: info?.description ?? `Matched pattern: ${match.pattern}`,
|
|
133
|
+
confidence: match.confidence,
|
|
134
|
+
evidence: match.match,
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
export async function scanDirectoryForAIPatterns(projectPath, options = {}) {
|
|
139
|
+
const extensions = options.extensions ?? ["ts", "tsx", "js", "jsx", "py", "go", "rb"];
|
|
140
|
+
const exclude = options.exclude ?? ["node_modules", "dist", ".git", "build", "coverage"];
|
|
141
|
+
const pattern = `**/*.{${extensions.join(",")}}`;
|
|
142
|
+
const files = await glob(pattern, {
|
|
143
|
+
cwd: projectPath,
|
|
144
|
+
ignore: exclude.map((e) => `**/${e}/**`),
|
|
145
|
+
absolute: true,
|
|
146
|
+
});
|
|
147
|
+
const allMatches = [];
|
|
148
|
+
for (const file of files) {
|
|
149
|
+
const matches = await detectAIPatterns(file);
|
|
150
|
+
allMatches.push(...matches);
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
files: files.length,
|
|
154
|
+
matches: allMatches,
|
|
155
|
+
indicators: patternMatchesToIndicators(allMatches),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
export function calculateAILikelihood(indicators) {
|
|
159
|
+
if (indicators.length === 0)
|
|
160
|
+
return 0;
|
|
161
|
+
const weights = {
|
|
162
|
+
high: 25,
|
|
163
|
+
medium: 15,
|
|
164
|
+
low: 5,
|
|
165
|
+
uncertain: 2,
|
|
166
|
+
};
|
|
167
|
+
let score = 0;
|
|
168
|
+
for (const indicator of indicators) {
|
|
169
|
+
score += weights[indicator.confidence];
|
|
170
|
+
}
|
|
171
|
+
return Math.min(100, score);
|
|
172
|
+
}
|
|
173
|
+
export function aggregateByFile(indicators) {
|
|
174
|
+
const fileMap = new Map();
|
|
175
|
+
for (const indicator of indicators) {
|
|
176
|
+
const existing = fileMap.get(indicator.location.file) ?? [];
|
|
177
|
+
existing.push(indicator);
|
|
178
|
+
fileMap.set(indicator.location.file, existing);
|
|
179
|
+
}
|
|
180
|
+
const result = new Map();
|
|
181
|
+
const confidenceOrder = ["high", "medium", "low", "uncertain"];
|
|
182
|
+
for (const [file, fileIndicators] of fileMap) {
|
|
183
|
+
const maxConfidence = confidenceOrder.find((c) => fileIndicators.some((i) => i.confidence === c)) ?? "uncertain";
|
|
184
|
+
result.set(file, {
|
|
185
|
+
count: fileIndicators.length,
|
|
186
|
+
maxConfidence,
|
|
187
|
+
likelihood: calculateAILikelihood(fileIndicators),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=ai-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-detector.js","sourceRoot":"","sources":["../../../src/scanners/ai-code/ai-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confidence Scorer
|
|
3
|
+
*
|
|
4
|
+
* Fuses multiple signals into a per-change confidence score
|
|
5
|
+
* to determine AI generation likelihood and review requirements.
|
|
6
|
+
*
|
|
7
|
+
* @module scanners/ai-code/confidence-scorer
|
|
8
|
+
*/
|
|
9
|
+
import type { AIIndicator, HallucinationFinding, ScoredChange, AIVerifyConfig } from "./types.js";
|
|
10
|
+
interface ChangeInput {
|
|
11
|
+
file: string;
|
|
12
|
+
startLine: number;
|
|
13
|
+
endLine: number;
|
|
14
|
+
changeType: "added" | "modified" | "deleted";
|
|
15
|
+
indicators: AIIndicator[];
|
|
16
|
+
hallucinations: HallucinationFinding[];
|
|
17
|
+
}
|
|
18
|
+
export declare function scoreChange(input: ChangeInput, config?: AIVerifyConfig): ScoredChange;
|
|
19
|
+
export declare function scoreAllChanges(changes: ChangeInput[], config?: AIVerifyConfig): {
|
|
20
|
+
scoredChanges: ScoredChange[];
|
|
21
|
+
summary: {
|
|
22
|
+
totalChanges: number;
|
|
23
|
+
aiLikelyChanges: number;
|
|
24
|
+
requiresReview: number;
|
|
25
|
+
hallucinationsFound: number;
|
|
26
|
+
averageConfidence: number;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export declare function calculateDetectionScore(scoredChanges: ScoredChange[]): number;
|
|
30
|
+
export declare function calculateHallucinationScore(scoredChanges: ScoredChange[]): number;
|
|
31
|
+
export declare function calculateReviewScore(scoredChanges: ScoredChange[]): number;
|
|
32
|
+
export declare function calculateOverallScore(scores: {
|
|
33
|
+
detectionScore: number;
|
|
34
|
+
hallucinationScore: number;
|
|
35
|
+
reviewScore: number;
|
|
36
|
+
}): number;
|
|
37
|
+
export declare function determineReviewPriority(change: ScoredChange): "critical" | "high" | "medium" | "low" | "none";
|
|
38
|
+
export declare function groupByReviewPriority(scoredChanges: ScoredChange[]): Record<string, ScoredChange[]>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=confidence-scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence-scorer.d.ts","sourceRoot":"","sources":["../../../src/scanners/ai-code/confidence-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACpB,YAAY,EAEZ,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7C,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,cAAc,EAAE,oBAAoB,EAAE,CAAC;CACxC;AAgBD,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,cAAc,GACtB,YAAY,CA8Cd;AAYD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,CAAC,EAAE,cAAc,GACtB;IACD,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;QACvB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH,CA+BA;AAED,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,YAAY,EAAE,GAAG,MAAM,CAQ7E;AAED,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,YAAY,EAAE,GAC5B,MAAM,CAWR;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,YAAY,EAAE,GAAG,MAAM,CAO1E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAYT;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,GACnB,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAgBjD;AAED,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,YAAY,EAAE,GAC5B,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAehC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confidence Scorer
|
|
3
|
+
*
|
|
4
|
+
* Fuses multiple signals into a per-change confidence score
|
|
5
|
+
* to determine AI generation likelihood and review requirements.
|
|
6
|
+
*
|
|
7
|
+
* @module scanners/ai-code/confidence-scorer
|
|
8
|
+
*/
|
|
9
|
+
const CONFIDENCE_WEIGHTS = {
|
|
10
|
+
high: 30,
|
|
11
|
+
medium: 15,
|
|
12
|
+
low: 5,
|
|
13
|
+
uncertain: 2,
|
|
14
|
+
};
|
|
15
|
+
const HALLUCINATION_WEIGHTS = {
|
|
16
|
+
critical: 40,
|
|
17
|
+
high: 25,
|
|
18
|
+
medium: 12,
|
|
19
|
+
low: 5,
|
|
20
|
+
};
|
|
21
|
+
export function scoreChange(input, config) {
|
|
22
|
+
const { indicators, hallucinations } = input;
|
|
23
|
+
let aiLikelihood = 0;
|
|
24
|
+
for (const indicator of indicators) {
|
|
25
|
+
aiLikelihood += CONFIDENCE_WEIGHTS[indicator.confidence];
|
|
26
|
+
}
|
|
27
|
+
for (const hallucination of hallucinations) {
|
|
28
|
+
aiLikelihood += HALLUCINATION_WEIGHTS[hallucination.severity] ?? 10;
|
|
29
|
+
}
|
|
30
|
+
aiLikelihood = Math.min(100, aiLikelihood);
|
|
31
|
+
const confidence = determineConfidence(aiLikelihood, indicators.length);
|
|
32
|
+
const requireForConfidence = config?.review?.requireForConfidence ?? "medium";
|
|
33
|
+
const requireForHallucinations = config?.review?.requireForHallucinations ?? true;
|
|
34
|
+
const autoApproveBelow = config?.review?.autoApproveBelow ?? 30;
|
|
35
|
+
const confidenceOrder = ["high", "medium", "low", "uncertain"];
|
|
36
|
+
const confidenceThresholdMet = confidenceOrder.indexOf(confidence) <= confidenceOrder.indexOf(requireForConfidence);
|
|
37
|
+
const hasHallucinations = hallucinations.length > 0;
|
|
38
|
+
const requiresReview = (confidenceThresholdMet && aiLikelihood >= autoApproveBelow) ||
|
|
39
|
+
(requireForHallucinations && hasHallucinations);
|
|
40
|
+
let reviewReason;
|
|
41
|
+
if (requiresReview) {
|
|
42
|
+
if (hasHallucinations && requireForHallucinations) {
|
|
43
|
+
reviewReason = `${hallucinations.length} hallucination(s) detected`;
|
|
44
|
+
}
|
|
45
|
+
else if (confidenceThresholdMet) {
|
|
46
|
+
reviewReason = `AI likelihood ${aiLikelihood}% with ${confidence} confidence`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
...input,
|
|
51
|
+
aiLikelihood,
|
|
52
|
+
confidence,
|
|
53
|
+
requiresReview,
|
|
54
|
+
reviewReason,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function determineConfidence(aiLikelihood, indicatorCount) {
|
|
58
|
+
if (aiLikelihood >= 70 && indicatorCount >= 3)
|
|
59
|
+
return "high";
|
|
60
|
+
if (aiLikelihood >= 40 && indicatorCount >= 2)
|
|
61
|
+
return "medium";
|
|
62
|
+
if (aiLikelihood >= 15 || indicatorCount >= 1)
|
|
63
|
+
return "low";
|
|
64
|
+
return "uncertain";
|
|
65
|
+
}
|
|
66
|
+
export function scoreAllChanges(changes, config) {
|
|
67
|
+
const scoredChanges = changes.map((c) => scoreChange(c, config));
|
|
68
|
+
const aiThreshold = config?.review?.autoApproveBelow ?? 30;
|
|
69
|
+
const aiLikelyChanges = scoredChanges.filter((c) => c.aiLikelihood >= aiThreshold).length;
|
|
70
|
+
const requiresReview = scoredChanges.filter((c) => c.requiresReview).length;
|
|
71
|
+
const hallucinationsFound = scoredChanges.reduce((sum, c) => sum + c.hallucinations.length, 0);
|
|
72
|
+
const averageConfidence = scoredChanges.length > 0
|
|
73
|
+
? scoredChanges.reduce((sum, c) => sum + c.aiLikelihood, 0) /
|
|
74
|
+
scoredChanges.length
|
|
75
|
+
: 0;
|
|
76
|
+
return {
|
|
77
|
+
scoredChanges,
|
|
78
|
+
summary: {
|
|
79
|
+
totalChanges: scoredChanges.length,
|
|
80
|
+
aiLikelyChanges,
|
|
81
|
+
requiresReview,
|
|
82
|
+
hallucinationsFound,
|
|
83
|
+
averageConfidence: Math.round(averageConfidence * 10) / 10,
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function calculateDetectionScore(scoredChanges) {
|
|
88
|
+
if (scoredChanges.length === 0)
|
|
89
|
+
return 100;
|
|
90
|
+
const avgLikelihood = scoredChanges.reduce((sum, c) => sum + c.aiLikelihood, 0) /
|
|
91
|
+
scoredChanges.length;
|
|
92
|
+
return Math.round(100 - avgLikelihood);
|
|
93
|
+
}
|
|
94
|
+
export function calculateHallucinationScore(scoredChanges) {
|
|
95
|
+
const allHallucinations = scoredChanges.flatMap((c) => c.hallucinations);
|
|
96
|
+
if (allHallucinations.length === 0)
|
|
97
|
+
return 100;
|
|
98
|
+
let penalty = 0;
|
|
99
|
+
for (const h of allHallucinations) {
|
|
100
|
+
penalty += HALLUCINATION_WEIGHTS[h.severity] ?? 10;
|
|
101
|
+
}
|
|
102
|
+
return Math.max(0, Math.round(100 - penalty));
|
|
103
|
+
}
|
|
104
|
+
export function calculateReviewScore(scoredChanges) {
|
|
105
|
+
if (scoredChanges.length === 0)
|
|
106
|
+
return 100;
|
|
107
|
+
const reviewRequired = scoredChanges.filter((c) => c.requiresReview).length;
|
|
108
|
+
const reviewRate = reviewRequired / scoredChanges.length;
|
|
109
|
+
return Math.round((1 - reviewRate) * 100);
|
|
110
|
+
}
|
|
111
|
+
export function calculateOverallScore(scores) {
|
|
112
|
+
const weights = {
|
|
113
|
+
detection: 0.3,
|
|
114
|
+
hallucination: 0.5,
|
|
115
|
+
review: 0.2,
|
|
116
|
+
};
|
|
117
|
+
return Math.round(scores.detectionScore * weights.detection +
|
|
118
|
+
scores.hallucinationScore * weights.hallucination +
|
|
119
|
+
scores.reviewScore * weights.review);
|
|
120
|
+
}
|
|
121
|
+
export function determineReviewPriority(change) {
|
|
122
|
+
if (!change.requiresReview)
|
|
123
|
+
return "none";
|
|
124
|
+
const hasCriticalHallucination = change.hallucinations.some((h) => h.severity === "critical");
|
|
125
|
+
if (hasCriticalHallucination)
|
|
126
|
+
return "critical";
|
|
127
|
+
const hasHighHallucination = change.hallucinations.some((h) => h.severity === "high");
|
|
128
|
+
if (hasHighHallucination || change.confidence === "high")
|
|
129
|
+
return "high";
|
|
130
|
+
if (change.confidence === "medium")
|
|
131
|
+
return "medium";
|
|
132
|
+
return "low";
|
|
133
|
+
}
|
|
134
|
+
export function groupByReviewPriority(scoredChanges) {
|
|
135
|
+
const groups = {
|
|
136
|
+
critical: [],
|
|
137
|
+
high: [],
|
|
138
|
+
medium: [],
|
|
139
|
+
low: [],
|
|
140
|
+
none: [],
|
|
141
|
+
};
|
|
142
|
+
for (const change of scoredChanges) {
|
|
143
|
+
const priority = determineReviewPriority(change);
|
|
144
|
+
groups[priority].push(change);
|
|
145
|
+
}
|
|
146
|
+
return groups;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=confidence-scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence-scorer.js","sourceRoot":"","sources":["../../../src/scanners/ai-code/confidence-scorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hallucination Checker
|
|
3
|
+
*
|
|
4
|
+
* Detects non-existent imports, fabricated APIs, and incorrect patterns
|
|
5
|
+
* commonly produced by AI code generation.
|
|
6
|
+
*
|
|
7
|
+
* @module scanners/ai-code/hallucination-checker
|
|
8
|
+
*/
|
|
9
|
+
import type { HallucinationFinding, HallucinationType } from "./types.js";
|
|
10
|
+
interface ImportInfo {
|
|
11
|
+
source: string;
|
|
12
|
+
specifiers: string[];
|
|
13
|
+
line: number;
|
|
14
|
+
isRelative: boolean;
|
|
15
|
+
isPackage: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function parseImports(content: string, filePath: string): ImportInfo[];
|
|
18
|
+
export declare function checkRelativeImport(importInfo: ImportInfo, sourceFilePath: string, projectPath: string): Promise<HallucinationFinding | null>;
|
|
19
|
+
export declare function checkPackageImport(importInfo: ImportInfo, projectPath: string): Promise<HallucinationFinding | null>;
|
|
20
|
+
export declare function checkDeprecatedAPIs(content: string, filePath: string): HallucinationFinding[];
|
|
21
|
+
export declare function checkMixedFrameworks(content: string, filePath: string): HallucinationFinding[];
|
|
22
|
+
export declare function checkFileForHallucinations(filePath: string, projectPath: string, content?: string): Promise<HallucinationFinding[]>;
|
|
23
|
+
export declare function scanDirectoryForHallucinations(projectPath: string, options?: {
|
|
24
|
+
extensions?: string[];
|
|
25
|
+
exclude?: string[];
|
|
26
|
+
}): Promise<{
|
|
27
|
+
files: number;
|
|
28
|
+
findings: HallucinationFinding[];
|
|
29
|
+
summary: {
|
|
30
|
+
byType: Record<HallucinationType, number>;
|
|
31
|
+
bySeverity: Record<string, number>;
|
|
32
|
+
};
|
|
33
|
+
}>;
|
|
34
|
+
export declare function calculateHallucinationScore(findings: HallucinationFinding[]): number;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=hallucination-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hallucination-checker.d.ts","sourceRoot":"","sources":["../../../src/scanners/ai-code/hallucination-checker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1E,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AA4CD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CA2C5E;AAeD,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAoCtC;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CA6DtC;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,oBAAoB,EAAE,CA0BxB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,oBAAoB,EAAE,CAoBxB;AAED,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAyBjC;AAED,wBAAsB,8BAA8B,CAClD,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACf,GACL,OAAO,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,oBAAoB,EAAE,CAAC;IACjC,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC1C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC,CAAC;CACH,CAAC,CAkCD;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAgBpF"}
|