@shakecodeslikecray/whiterose 1.0.12 → 2.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/dist/cli/index.js +937 -24
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +145 -1
- package/dist/index.js +160 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -647,6 +647,141 @@ declare const CodebaseUnderstanding: z.ZodObject<{
|
|
|
647
647
|
};
|
|
648
648
|
}>;
|
|
649
649
|
type CodebaseUnderstanding = z.infer<typeof CodebaseUnderstanding>;
|
|
650
|
+
declare const DomainType: z.ZodString;
|
|
651
|
+
type DomainType = z.infer<typeof DomainType>;
|
|
652
|
+
declare const RiskLevel: z.ZodEnum<["critical", "high", "medium"]>;
|
|
653
|
+
type RiskLevel = z.infer<typeof RiskLevel>;
|
|
654
|
+
declare const HotPath: z.ZodObject<{
|
|
655
|
+
file: z.ZodString;
|
|
656
|
+
reason: z.ZodString;
|
|
657
|
+
riskLevel: z.ZodEnum<["critical", "high", "medium"]>;
|
|
658
|
+
}, "strip", z.ZodTypeAny, {
|
|
659
|
+
file: string;
|
|
660
|
+
reason: string;
|
|
661
|
+
riskLevel: "critical" | "high" | "medium";
|
|
662
|
+
}, {
|
|
663
|
+
file: string;
|
|
664
|
+
reason: string;
|
|
665
|
+
riskLevel: "critical" | "high" | "medium";
|
|
666
|
+
}>;
|
|
667
|
+
type HotPath = z.infer<typeof HotPath>;
|
|
668
|
+
declare const CustomPassConfig: z.ZodObject<{
|
|
669
|
+
id: z.ZodString;
|
|
670
|
+
phase: z.ZodEnum<["unit", "integration", "e2e"]>;
|
|
671
|
+
category: z.ZodString;
|
|
672
|
+
description: z.ZodString;
|
|
673
|
+
}, "strip", z.ZodTypeAny, {
|
|
674
|
+
id: string;
|
|
675
|
+
description: string;
|
|
676
|
+
category: string;
|
|
677
|
+
phase: "unit" | "integration" | "e2e";
|
|
678
|
+
}, {
|
|
679
|
+
id: string;
|
|
680
|
+
description: string;
|
|
681
|
+
category: string;
|
|
682
|
+
phase: "unit" | "integration" | "e2e";
|
|
683
|
+
}>;
|
|
684
|
+
type CustomPassConfig = z.infer<typeof CustomPassConfig>;
|
|
685
|
+
declare const SkipReason: z.ZodObject<{
|
|
686
|
+
passName: z.ZodString;
|
|
687
|
+
reason: z.ZodString;
|
|
688
|
+
}, "strip", z.ZodTypeAny, {
|
|
689
|
+
passName: string;
|
|
690
|
+
reason: string;
|
|
691
|
+
}, {
|
|
692
|
+
passName: string;
|
|
693
|
+
reason: string;
|
|
694
|
+
}>;
|
|
695
|
+
type SkipReason = z.infer<typeof SkipReason>;
|
|
696
|
+
declare const RiskProfile: z.ZodObject<{
|
|
697
|
+
version: z.ZodString;
|
|
698
|
+
generatedAt: z.ZodString;
|
|
699
|
+
domains: z.ZodArray<z.ZodString, "many">;
|
|
700
|
+
sensitiveDataTypes: z.ZodArray<z.ZodString, "many">;
|
|
701
|
+
externalDependencies: z.ZodArray<z.ZodString, "many">;
|
|
702
|
+
hotPaths: z.ZodArray<z.ZodObject<{
|
|
703
|
+
file: z.ZodString;
|
|
704
|
+
reason: z.ZodString;
|
|
705
|
+
riskLevel: z.ZodEnum<["critical", "high", "medium"]>;
|
|
706
|
+
}, "strip", z.ZodTypeAny, {
|
|
707
|
+
file: string;
|
|
708
|
+
reason: string;
|
|
709
|
+
riskLevel: "critical" | "high" | "medium";
|
|
710
|
+
}, {
|
|
711
|
+
file: string;
|
|
712
|
+
reason: string;
|
|
713
|
+
riskLevel: "critical" | "high" | "medium";
|
|
714
|
+
}>, "many">;
|
|
715
|
+
customPasses: z.ZodArray<z.ZodObject<{
|
|
716
|
+
id: z.ZodString;
|
|
717
|
+
phase: z.ZodEnum<["unit", "integration", "e2e"]>;
|
|
718
|
+
category: z.ZodString;
|
|
719
|
+
description: z.ZodString;
|
|
720
|
+
}, "strip", z.ZodTypeAny, {
|
|
721
|
+
id: string;
|
|
722
|
+
description: string;
|
|
723
|
+
category: string;
|
|
724
|
+
phase: "unit" | "integration" | "e2e";
|
|
725
|
+
}, {
|
|
726
|
+
id: string;
|
|
727
|
+
description: string;
|
|
728
|
+
category: string;
|
|
729
|
+
phase: "unit" | "integration" | "e2e";
|
|
730
|
+
}>, "many">;
|
|
731
|
+
skippedPasses: z.ZodArray<z.ZodObject<{
|
|
732
|
+
passName: z.ZodString;
|
|
733
|
+
reason: z.ZodString;
|
|
734
|
+
}, "strip", z.ZodTypeAny, {
|
|
735
|
+
passName: string;
|
|
736
|
+
reason: string;
|
|
737
|
+
}, {
|
|
738
|
+
passName: string;
|
|
739
|
+
reason: string;
|
|
740
|
+
}>, "many">;
|
|
741
|
+
}, "strip", z.ZodTypeAny, {
|
|
742
|
+
version: string;
|
|
743
|
+
generatedAt: string;
|
|
744
|
+
domains: string[];
|
|
745
|
+
sensitiveDataTypes: string[];
|
|
746
|
+
externalDependencies: string[];
|
|
747
|
+
hotPaths: {
|
|
748
|
+
file: string;
|
|
749
|
+
reason: string;
|
|
750
|
+
riskLevel: "critical" | "high" | "medium";
|
|
751
|
+
}[];
|
|
752
|
+
customPasses: {
|
|
753
|
+
id: string;
|
|
754
|
+
description: string;
|
|
755
|
+
category: string;
|
|
756
|
+
phase: "unit" | "integration" | "e2e";
|
|
757
|
+
}[];
|
|
758
|
+
skippedPasses: {
|
|
759
|
+
passName: string;
|
|
760
|
+
reason: string;
|
|
761
|
+
}[];
|
|
762
|
+
}, {
|
|
763
|
+
version: string;
|
|
764
|
+
generatedAt: string;
|
|
765
|
+
domains: string[];
|
|
766
|
+
sensitiveDataTypes: string[];
|
|
767
|
+
externalDependencies: string[];
|
|
768
|
+
hotPaths: {
|
|
769
|
+
file: string;
|
|
770
|
+
reason: string;
|
|
771
|
+
riskLevel: "critical" | "high" | "medium";
|
|
772
|
+
}[];
|
|
773
|
+
customPasses: {
|
|
774
|
+
id: string;
|
|
775
|
+
description: string;
|
|
776
|
+
category: string;
|
|
777
|
+
phase: "unit" | "integration" | "e2e";
|
|
778
|
+
}[];
|
|
779
|
+
skippedPasses: {
|
|
780
|
+
passName: string;
|
|
781
|
+
reason: string;
|
|
782
|
+
}[];
|
|
783
|
+
}>;
|
|
784
|
+
type RiskProfile = z.infer<typeof RiskProfile>;
|
|
650
785
|
declare const FileHash: z.ZodObject<{
|
|
651
786
|
path: z.ZodString;
|
|
652
787
|
hash: z.ZodString;
|
|
@@ -1249,6 +1384,7 @@ interface ScanContext {
|
|
|
1249
1384
|
understanding: CodebaseUnderstanding;
|
|
1250
1385
|
staticResults: StaticFinding[];
|
|
1251
1386
|
config?: WhiteroseConfig;
|
|
1387
|
+
riskProfile?: RiskProfile;
|
|
1252
1388
|
}
|
|
1253
1389
|
interface ScanProgress {
|
|
1254
1390
|
onPhaseStart?: (phase: string, passCount: number) => void;
|
|
@@ -1317,6 +1453,14 @@ declare class CoreScanner {
|
|
|
1317
1453
|
* Build E2E pass jobs - these see static + unit + integration findings
|
|
1318
1454
|
*/
|
|
1319
1455
|
private buildE2EPassJobs;
|
|
1456
|
+
/**
|
|
1457
|
+
* Build custom pass jobs from risk profile
|
|
1458
|
+
*/
|
|
1459
|
+
private buildCustomPassJobs;
|
|
1460
|
+
/**
|
|
1461
|
+
* Boost confidence for custom pass findings (targeted = higher signal-to-noise)
|
|
1462
|
+
*/
|
|
1463
|
+
private boostCustomPassConfidence;
|
|
1320
1464
|
private buildQuickScanPrompt;
|
|
1321
1465
|
private parseResponse;
|
|
1322
1466
|
private parseBugData;
|
|
@@ -1636,4 +1780,4 @@ declare function analyzeSmells(cwd: string): Promise<CodeSmell[]>;
|
|
|
1636
1780
|
*/
|
|
1637
1781
|
declare function getSmellsSummary(cwd: string): Promise<string>;
|
|
1638
1782
|
|
|
1639
|
-
export { type AdversarialResult, BehavioralContract, Bug, BugCategory, BugSeverity, BugStatus, CacheState, CodePathStep, CodebaseUnderstanding, ConfidenceLevel, ConfidenceScore, CoreScanner, FeatureIntent, FileHash, FindingKind, type GitStatus, MonorepoConfig, type MonorepoInfo, type Package, PackageConfig, PriorityLevel, type PromptExecutor, type PromptOptions, type PromptResult, ProviderType, ScanMeta, ScanResult, ScanSummary, SeverityBreakdown, type StaticAnalysisResult, WhiteroseConfig, analyzeContracts, analyzeCrossFile, analyzeSmells, applyFix, batchFix, buildDependencyGraph, commitFix, createFixBranch, dependsOn, detectMonorepo, detectProvider, findCircularDependencies, generateIntentDocument, getAvailableExecutors, getChangedFiles, getCommandEffectsSummary, getContractSummary, getCrossPackageDependencies, getCurrentBranch, getDependentFiles, getDiff, getExecutor, getFileAtHead, getGitStatus, getImportsOf, getPackageFiles, getPackageForFile, getSmellsSummary, getStagedDiff, groupFilesByPackage, hasUncommittedChanges, isGitRepo, isProviderAvailable, loadConfig, loadUnderstanding, mergeIntentWithUnderstanding, outputMarkdown, outputSarif, parseIntentDocument, popStash, resetFile, runStaticAnalysis, saveConfig, scanCodebase, stashChanges };
|
|
1783
|
+
export { type AdversarialResult, BehavioralContract, Bug, BugCategory, BugSeverity, BugStatus, CacheState, CodePathStep, CodebaseUnderstanding, ConfidenceLevel, ConfidenceScore, CoreScanner, CustomPassConfig, DomainType, FeatureIntent, FileHash, FindingKind, type GitStatus, HotPath, MonorepoConfig, type MonorepoInfo, type Package, PackageConfig, PriorityLevel, type PromptExecutor, type PromptOptions, type PromptResult, ProviderType, RiskLevel, RiskProfile, ScanMeta, ScanResult, ScanSummary, SeverityBreakdown, SkipReason, type StaticAnalysisResult, WhiteroseConfig, analyzeContracts, analyzeCrossFile, analyzeSmells, applyFix, batchFix, buildDependencyGraph, commitFix, createFixBranch, dependsOn, detectMonorepo, detectProvider, findCircularDependencies, generateIntentDocument, getAvailableExecutors, getChangedFiles, getCommandEffectsSummary, getContractSummary, getCrossPackageDependencies, getCurrentBranch, getDependentFiles, getDiff, getExecutor, getFileAtHead, getGitStatus, getImportsOf, getPackageFiles, getPackageForFile, getSmellsSummary, getStagedDiff, groupFilesByPackage, hasUncommittedChanges, isGitRepo, isProviderAvailable, loadConfig, loadUnderstanding, mergeIntentWithUnderstanding, outputMarkdown, outputSarif, parseIntentDocument, popStash, resetFile, runStaticAnalysis, saveConfig, scanCodebase, stashChanges };
|
package/dist/index.js
CHANGED
|
@@ -191,6 +191,33 @@ var CodebaseUnderstanding = z.object({
|
|
|
191
191
|
packages: z.array(z.string()).optional()
|
|
192
192
|
})
|
|
193
193
|
});
|
|
194
|
+
var DomainType = z.string();
|
|
195
|
+
var RiskLevel = z.enum(["critical", "high", "medium"]);
|
|
196
|
+
var HotPath = z.object({
|
|
197
|
+
file: z.string(),
|
|
198
|
+
reason: z.string(),
|
|
199
|
+
riskLevel: RiskLevel
|
|
200
|
+
});
|
|
201
|
+
var CustomPassConfig = z.object({
|
|
202
|
+
id: z.string(),
|
|
203
|
+
phase: z.enum(["unit", "integration", "e2e"]),
|
|
204
|
+
category: z.string(),
|
|
205
|
+
description: z.string()
|
|
206
|
+
});
|
|
207
|
+
var SkipReason = z.object({
|
|
208
|
+
passName: z.string(),
|
|
209
|
+
reason: z.string()
|
|
210
|
+
});
|
|
211
|
+
var RiskProfile = z.object({
|
|
212
|
+
version: z.string(),
|
|
213
|
+
generatedAt: z.string().datetime(),
|
|
214
|
+
domains: z.array(DomainType),
|
|
215
|
+
sensitiveDataTypes: z.array(z.string()),
|
|
216
|
+
externalDependencies: z.array(z.string()),
|
|
217
|
+
hotPaths: z.array(HotPath),
|
|
218
|
+
customPasses: z.array(CustomPassConfig),
|
|
219
|
+
skippedPasses: z.array(SkipReason)
|
|
220
|
+
});
|
|
194
221
|
var FileHash = z.object({
|
|
195
222
|
path: z.string(),
|
|
196
223
|
hash: z.string(),
|
|
@@ -1675,6 +1702,67 @@ IMPORTANT:
|
|
|
1675
1702
|
- If unsure, report it with confidence="low"
|
|
1676
1703
|
- Aim for thoroughness - finding 10 potential issues is better than finding 0 confirmed bugs`;
|
|
1677
1704
|
}
|
|
1705
|
+
function buildCustomPassPrompt(customPass, ctx) {
|
|
1706
|
+
const { projectType, framework, language, totalFiles } = ctx;
|
|
1707
|
+
const staticSection = ctx.staticFindings?.length ? `
|
|
1708
|
+
## STATIC ANALYSIS SIGNALS
|
|
1709
|
+
${ctx.staticFindings.slice(0, 15).map((f) => `- ${f.tool}: ${f.file}:${f.line} - ${f.message}`).join("\n")}
|
|
1710
|
+
` : "";
|
|
1711
|
+
return `You are a security specialist performing a TARGETED analysis: ${customPass.id.toUpperCase()}.
|
|
1712
|
+
|
|
1713
|
+
## YOUR SINGLE MISSION
|
|
1714
|
+
${customPass.description}
|
|
1715
|
+
|
|
1716
|
+
## PROJECT CONTEXT
|
|
1717
|
+
- Type: ${projectType}
|
|
1718
|
+
- Framework: ${framework || "Unknown"}
|
|
1719
|
+
- Language: ${language}
|
|
1720
|
+
- Size: ${totalFiles} files
|
|
1721
|
+
${staticSection}
|
|
1722
|
+
## METHODOLOGY
|
|
1723
|
+
|
|
1724
|
+
1. Search the codebase for patterns relevant to: ${customPass.category}
|
|
1725
|
+
2. Read files that match and analyze for the specific issues described above
|
|
1726
|
+
3. Trace data flow to confirm the issue is real
|
|
1727
|
+
4. Report all confirmed and suspected issues
|
|
1728
|
+
|
|
1729
|
+
## REPORTING FORMAT
|
|
1730
|
+
|
|
1731
|
+
When you find an issue:
|
|
1732
|
+
|
|
1733
|
+
<json>
|
|
1734
|
+
{
|
|
1735
|
+
"type": "bug",
|
|
1736
|
+
"data": {
|
|
1737
|
+
"file": "src/path/to/file.ts",
|
|
1738
|
+
"line": 42,
|
|
1739
|
+
"endLine": 45,
|
|
1740
|
+
"title": "Short description of the issue",
|
|
1741
|
+
"description": "Explanation of why this is problematic and potential impact.",
|
|
1742
|
+
"kind": "bug|smell",
|
|
1743
|
+
"category": "${customPass.category}",
|
|
1744
|
+
"severity": "critical|high|medium|low",
|
|
1745
|
+
"confidence": "high|medium|low",
|
|
1746
|
+
"evidence": [
|
|
1747
|
+
"Evidence point 1",
|
|
1748
|
+
"Evidence point 2"
|
|
1749
|
+
],
|
|
1750
|
+
"suggestedFix": "Optional: how to fix it"
|
|
1751
|
+
}
|
|
1752
|
+
}
|
|
1753
|
+
</json>
|
|
1754
|
+
|
|
1755
|
+
Progress updates:
|
|
1756
|
+
###SCANNING:path/to/file.ts
|
|
1757
|
+
|
|
1758
|
+
When done:
|
|
1759
|
+
###COMPLETE
|
|
1760
|
+
|
|
1761
|
+
## BEGIN
|
|
1762
|
+
|
|
1763
|
+
Search for ${customPass.id} patterns. Read files that match. Report issues as you find them.
|
|
1764
|
+
This is a TARGETED pass - focus exclusively on: ${customPass.description}`;
|
|
1765
|
+
}
|
|
1678
1766
|
|
|
1679
1767
|
// src/providers/prompts/constants.ts
|
|
1680
1768
|
var PROJECT_TYPES_PROMPT = `PROJECT TYPE OPTIONS (pick the best fit):
|
|
@@ -2640,38 +2728,68 @@ var CoreScanner = class {
|
|
|
2640
2728
|
const startTime = Date.now();
|
|
2641
2729
|
this.passErrors = [];
|
|
2642
2730
|
const pipeline = getFullAnalysisPipeline();
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
const
|
|
2731
|
+
let unitPasses = pipeline[0].passes;
|
|
2732
|
+
let integrationPasses = pipeline[1].passes;
|
|
2733
|
+
let e2ePasses = pipeline[2].passes;
|
|
2734
|
+
const rp = context.riskProfile;
|
|
2735
|
+
const skippedNames = new Set(rp?.skippedPasses.map((s) => s.passName) || []);
|
|
2736
|
+
const customUnitPasses = rp?.customPasses.filter((p) => p.phase === "unit") || [];
|
|
2737
|
+
const customIntegrationPasses = rp?.customPasses.filter((p) => p.phase === "integration") || [];
|
|
2738
|
+
const customE2EPasses = rp?.customPasses.filter((p) => p.phase === "e2e") || [];
|
|
2739
|
+
if (skippedNames.size > 0) {
|
|
2740
|
+
unitPasses = unitPasses.filter((p) => !skippedNames.has(p));
|
|
2741
|
+
integrationPasses = integrationPasses.filter((p) => !skippedNames.has(p));
|
|
2742
|
+
e2ePasses = e2ePasses.filter((p) => !skippedNames.has(p));
|
|
2743
|
+
}
|
|
2744
|
+
const totalStandard = unitPasses.length + integrationPasses.length + e2ePasses.length;
|
|
2745
|
+
const totalCustom = customUnitPasses.length + customIntegrationPasses.length + customE2EPasses.length;
|
|
2746
|
+
const totalPasses = totalStandard + totalCustom;
|
|
2647
2747
|
this.report(`
|
|
2648
2748
|
\u2550\u2550\u2550\u2550 CORE SCANNER (PIPELINE MODE) \u2550\u2550\u2550\u2550`);
|
|
2649
2749
|
this.report(` Provider: ${this.executor.name}`);
|
|
2650
|
-
this.report(` Passes: ${totalPasses} (${unitPasses.length} unit \u2192 ${integrationPasses.length} integration \u2192 ${e2ePasses.length} E2E)`);
|
|
2750
|
+
this.report(` Passes: ${totalPasses} (${unitPasses.length + customUnitPasses.length} unit \u2192 ${integrationPasses.length + customIntegrationPasses.length} integration \u2192 ${e2ePasses.length + customE2EPasses.length} E2E)`);
|
|
2751
|
+
if (totalCustom > 0) {
|
|
2752
|
+
this.report(` Risk profile: ${totalCustom} custom passes, ${skippedNames.size} skipped`);
|
|
2753
|
+
}
|
|
2651
2754
|
this.report(` Findings flow: Unit \u2192 Integration \u2192 E2E`);
|
|
2652
2755
|
let globalBugIndex = 0;
|
|
2653
2756
|
this.report(`
|
|
2654
2757
|
\u2550\u2550\u2550\u2550 PHASE 1: UNIT ANALYSIS \u2550\u2550\u2550\u2550`);
|
|
2655
2758
|
this.report(` Looking for: injection, null refs, auth bypass, etc.`);
|
|
2759
|
+
const customUnitJobs = this.buildCustomPassJobs(context, customUnitPasses);
|
|
2760
|
+
const customUnitFindings = await this.runPassBatch(customUnitJobs, cwd, context.files, globalBugIndex);
|
|
2761
|
+
this.boostCustomPassConfidence(customUnitFindings);
|
|
2762
|
+
globalBugIndex += customUnitFindings.length;
|
|
2656
2763
|
const unitJobs = this.buildUnitPassJobs(context, unitPasses);
|
|
2657
|
-
const
|
|
2658
|
-
globalBugIndex +=
|
|
2764
|
+
const standardUnitFindings = await this.runPassBatch(unitJobs, cwd, context.files, globalBugIndex);
|
|
2765
|
+
globalBugIndex += standardUnitFindings.length;
|
|
2766
|
+
const unitFindings = [...customUnitFindings, ...standardUnitFindings];
|
|
2659
2767
|
this.report(` Phase 1 complete: ${unitFindings.length} findings`);
|
|
2660
2768
|
this.report(`
|
|
2661
2769
|
\u2550\u2550\u2550\u2550 PHASE 2: INTEGRATION ANALYSIS \u2550\u2550\u2550\u2550`);
|
|
2662
2770
|
this.report(` Building on ${unitFindings.length} unit findings`);
|
|
2663
2771
|
this.report(` Looking for: auth flows, data flows, trust boundaries`);
|
|
2772
|
+
const customIntJobs = this.buildCustomPassJobs(context, customIntegrationPasses);
|
|
2773
|
+
const customIntFindings = await this.runPassBatch(customIntJobs, cwd, context.files, globalBugIndex);
|
|
2774
|
+
this.boostCustomPassConfidence(customIntFindings);
|
|
2775
|
+
globalBugIndex += customIntFindings.length;
|
|
2664
2776
|
const integrationJobs = this.buildIntegrationPassJobs(context, integrationPasses, unitFindings);
|
|
2665
|
-
const
|
|
2666
|
-
globalBugIndex +=
|
|
2777
|
+
const standardIntFindings = await this.runPassBatch(integrationJobs, cwd, context.files, globalBugIndex);
|
|
2778
|
+
globalBugIndex += standardIntFindings.length;
|
|
2779
|
+
const integrationFindings = [...customIntFindings, ...standardIntFindings];
|
|
2667
2780
|
this.report(` Phase 2 complete: ${integrationFindings.length} findings`);
|
|
2668
2781
|
this.report(`
|
|
2669
2782
|
\u2550\u2550\u2550\u2550 PHASE 3: E2E ANALYSIS \u2550\u2550\u2550\u2550`);
|
|
2670
2783
|
this.report(` Building on ${unitFindings.length} unit + ${integrationFindings.length} integration findings`);
|
|
2671
2784
|
this.report(` Looking for: attack chains, privilege escalation, session bugs`);
|
|
2785
|
+
const customE2EJobs = this.buildCustomPassJobs(context, customE2EPasses);
|
|
2786
|
+
const customE2EFindings = await this.runPassBatch(customE2EJobs, cwd, context.files, globalBugIndex);
|
|
2787
|
+
this.boostCustomPassConfidence(customE2EFindings);
|
|
2788
|
+
globalBugIndex += customE2EFindings.length;
|
|
2672
2789
|
const allPreviousFindings = [...unitFindings, ...integrationFindings];
|
|
2673
2790
|
const e2eJobs = this.buildE2EPassJobs(context, e2ePasses, allPreviousFindings);
|
|
2674
|
-
const
|
|
2791
|
+
const standardE2EFindings = await this.runPassBatch(e2eJobs, cwd, context.files, globalBugIndex);
|
|
2792
|
+
const e2eFindings = [...customE2EFindings, ...standardE2EFindings];
|
|
2675
2793
|
this.report(` Phase 3 complete: ${e2eFindings.length} findings`);
|
|
2676
2794
|
this.report(`
|
|
2677
2795
|
\u2550\u2550\u2550\u2550 POST-PROCESSING \u2550\u2550\u2550\u2550`);
|
|
@@ -2977,6 +3095,37 @@ var CoreScanner = class {
|
|
|
2977
3095
|
}
|
|
2978
3096
|
return jobs;
|
|
2979
3097
|
}
|
|
3098
|
+
/**
|
|
3099
|
+
* Build custom pass jobs from risk profile
|
|
3100
|
+
*/
|
|
3101
|
+
buildCustomPassJobs(context, customPasses) {
|
|
3102
|
+
const jobs = [];
|
|
3103
|
+
const { understanding, staticResults } = context;
|
|
3104
|
+
for (const customPass of customPasses) {
|
|
3105
|
+
jobs.push({
|
|
3106
|
+
name: customPass.id,
|
|
3107
|
+
prompt: buildCustomPassPrompt(customPass, {
|
|
3108
|
+
pass: { name: customPass.id, category: customPass.category, description: customPass.description},
|
|
3109
|
+
projectType: understanding.summary.type,
|
|
3110
|
+
framework: understanding.summary.framework || "",
|
|
3111
|
+
language: understanding.summary.language,
|
|
3112
|
+
totalFiles: understanding.structure.totalFiles,
|
|
3113
|
+
staticFindings: staticResults
|
|
3114
|
+
})
|
|
3115
|
+
});
|
|
3116
|
+
}
|
|
3117
|
+
return jobs;
|
|
3118
|
+
}
|
|
3119
|
+
/**
|
|
3120
|
+
* Boost confidence for custom pass findings (targeted = higher signal-to-noise)
|
|
3121
|
+
*/
|
|
3122
|
+
boostCustomPassConfidence(bugs) {
|
|
3123
|
+
for (const bug of bugs) {
|
|
3124
|
+
if (bug.confidence.overall === "medium") {
|
|
3125
|
+
bug.confidence.overall = "high";
|
|
3126
|
+
}
|
|
3127
|
+
}
|
|
3128
|
+
}
|
|
2980
3129
|
buildQuickScanPrompt(context) {
|
|
2981
3130
|
const { understanding, staticResults, files } = context;
|
|
2982
3131
|
const staticSignals = staticResults.length > 0 ? `
|
|
@@ -5556,6 +5705,6 @@ async function getSmellsSummary(cwd) {
|
|
|
5556
5705
|
return lines.join("\n");
|
|
5557
5706
|
}
|
|
5558
5707
|
|
|
5559
|
-
export { BehavioralContract, Bug, BugCategory, BugSeverity, BugStatus, CacheState, CodePathStep, CodebaseUnderstanding, ConfidenceLevel, ConfidenceScore, CoreScanner, FeatureIntent, FileHash, FindingKind, MonorepoConfig, PackageConfig, PriorityLevel, ProviderType, ScanMeta, ScanResult, ScanSummary, SeverityBreakdown, WhiteroseConfig, analyzeContracts, analyzeCrossFile, analyzeSmells, applyFix, batchFix, buildDependencyGraph, commitFix, createFixBranch, dependsOn, detectMonorepo, detectProvider, findCircularDependencies, generateIntentDocument, getAvailableExecutors, getChangedFiles, getCommandEffectsSummary, getContractSummary, getCrossPackageDependencies, getCurrentBranch, getDependentFiles2 as getDependentFiles, getDiff, getExecutor, getFileAtHead, getGitStatus, getImportsOf, getPackageFiles, getPackageForFile, getSmellsSummary, getStagedDiff, groupFilesByPackage, hasUncommittedChanges, isGitRepo, isProviderAvailable, loadConfig, loadUnderstanding, mergeIntentWithUnderstanding, outputMarkdown, outputSarif, parseIntentDocument, popStash, resetFile, runStaticAnalysis, saveConfig, scanCodebase, stashChanges };
|
|
5708
|
+
export { BehavioralContract, Bug, BugCategory, BugSeverity, BugStatus, CacheState, CodePathStep, CodebaseUnderstanding, ConfidenceLevel, ConfidenceScore, CoreScanner, CustomPassConfig, DomainType, FeatureIntent, FileHash, FindingKind, HotPath, MonorepoConfig, PackageConfig, PriorityLevel, ProviderType, RiskLevel, RiskProfile, ScanMeta, ScanResult, ScanSummary, SeverityBreakdown, SkipReason, WhiteroseConfig, analyzeContracts, analyzeCrossFile, analyzeSmells, applyFix, batchFix, buildDependencyGraph, commitFix, createFixBranch, dependsOn, detectMonorepo, detectProvider, findCircularDependencies, generateIntentDocument, getAvailableExecutors, getChangedFiles, getCommandEffectsSummary, getContractSummary, getCrossPackageDependencies, getCurrentBranch, getDependentFiles2 as getDependentFiles, getDiff, getExecutor, getFileAtHead, getGitStatus, getImportsOf, getPackageFiles, getPackageForFile, getSmellsSummary, getStagedDiff, groupFilesByPackage, hasUncommittedChanges, isGitRepo, isProviderAvailable, loadConfig, loadUnderstanding, mergeIntentWithUnderstanding, outputMarkdown, outputSarif, parseIntentDocument, popStash, resetFile, runStaticAnalysis, saveConfig, scanCodebase, stashChanges };
|
|
5560
5709
|
//# sourceMappingURL=index.js.map
|
|
5561
5710
|
//# sourceMappingURL=index.js.map
|