@mergesignal/shared 0.2.7 → 0.3.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/actionsStepSummary.d.ts.map +1 -1
- package/dist/actionsStepSummary.js +2 -29
- package/dist/collectNarrativeWhyBullets.d.ts +12 -0
- package/dist/collectNarrativeWhyBullets.d.ts.map +1 -0
- package/dist/collectNarrativeWhyBullets.js +104 -0
- package/dist/deriveScanNarrative.d.ts +0 -3
- package/dist/deriveScanNarrative.d.ts.map +1 -1
- package/dist/deriveScanNarrative.js +177 -63
- package/dist/deriveScanNarrative.test.js +90 -6
- package/dist/engineWireRegression.test.d.ts +2 -0
- package/dist/engineWireRegression.test.d.ts.map +1 -0
- package/dist/engineWireRegression.test.js +57 -0
- package/dist/fixtures/legacyEngineRepoIntelligence.d.ts +28 -0
- package/dist/fixtures/legacyEngineRepoIntelligence.d.ts.map +1 -0
- package/dist/fixtures/legacyEngineRepoIntelligence.js +28 -0
- package/dist/fixtures/repoIntelligenceFixtures.d.ts +2 -2
- package/dist/fixtures/repoIntelligenceFixtures.d.ts.map +1 -1
- package/dist/fixtures/repoIntelligenceFixtures.js +59 -3
- package/dist/fixtures/repoIntelligenceTestHelpers.d.ts +5 -0
- package/dist/fixtures/repoIntelligenceTestHelpers.d.ts.map +1 -0
- package/dist/fixtures/repoIntelligenceTestHelpers.js +28 -0
- package/dist/formatInsight.d.ts +2 -2
- package/dist/formatInsight.d.ts.map +1 -1
- package/dist/formatInsight.js +2 -7
- package/dist/formatInsight.test.js +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/narrativeParity.test.d.ts +2 -0
- package/dist/narrativeParity.test.d.ts.map +1 -0
- package/dist/narrativeParity.test.js +65 -0
- package/dist/narrativePresentation.d.ts +50 -0
- package/dist/narrativePresentation.d.ts.map +1 -0
- package/dist/narrativePresentation.js +180 -0
- package/dist/narrativePresentation.test.d.ts +2 -0
- package/dist/narrativePresentation.test.d.ts.map +1 -0
- package/dist/narrativePresentation.test.js +54 -0
- package/dist/normalizeGeneratedText.d.ts +8 -0
- package/dist/normalizeGeneratedText.d.ts.map +1 -0
- package/dist/normalizeGeneratedText.js +31 -0
- package/dist/normalizeGeneratedText.test.d.ts +2 -0
- package/dist/normalizeGeneratedText.test.d.ts.map +1 -0
- package/dist/normalizeGeneratedText.test.js +18 -0
- package/dist/prCheckRunPresentation.d.ts +4 -3
- package/dist/prCheckRunPresentation.d.ts.map +1 -1
- package/dist/prCheckRunPresentation.js +56 -51
- package/dist/prCheckRunPresentation.test.js +2 -2
- package/dist/presentGitHubPrComment.d.ts +9 -0
- package/dist/presentGitHubPrComment.d.ts.map +1 -0
- package/dist/presentGitHubPrComment.js +80 -0
- package/dist/presentScanCardSummary.d.ts.map +1 -1
- package/dist/presentScanCardSummary.js +69 -64
- package/dist/repoIntelligenceMappers.d.ts +20 -0
- package/dist/repoIntelligenceMappers.d.ts.map +1 -0
- package/dist/repoIntelligenceMappers.js +60 -0
- package/dist/repoIntelligenceSchema.contract.test.d.ts +2 -0
- package/dist/repoIntelligenceSchema.contract.test.d.ts.map +1 -0
- package/dist/repoIntelligenceSchema.contract.test.js +19 -0
- package/dist/repoIntelligenceSchema.d.ts +52 -83
- package/dist/repoIntelligenceSchema.d.ts.map +1 -1
- package/dist/repoIntelligenceSchema.js +99 -141
- package/dist/repoIntelligenceValidation.d.ts +18 -0
- package/dist/repoIntelligenceValidation.d.ts.map +1 -0
- package/dist/repoIntelligenceValidation.js +76 -0
- package/dist/repoIntelligenceValidation.persist.test.d.ts +2 -0
- package/dist/repoIntelligenceValidation.persist.test.d.ts.map +1 -0
- package/dist/repoIntelligenceValidation.persist.test.js +44 -0
- package/dist/riskVocabulary.js +1 -1
- package/dist/scanCardSummary.d.ts +9 -1
- package/dist/scanCardSummary.d.ts.map +1 -1
- package/dist/scanCardSummary.js +1 -1
- package/dist/scanCardSummary.test.js +12 -8
- package/dist/scanDetailViewModel.d.ts +9 -1
- package/dist/scanDetailViewModel.d.ts.map +1 -1
- package/dist/scanDetailViewModel.js +164 -37
- package/dist/scanDetailViewModel.test.js +28 -1
- package/dist/scanNarrativeFacts.d.ts +23 -8
- package/dist/scanNarrativeFacts.d.ts.map +1 -1
- package/dist/scanNarrativeFacts.js +7 -0
- package/dist/scanSurfaceCopy.d.ts +26 -26
- package/dist/scanSurfaceCopy.d.ts.map +1 -1
- package/dist/scanSurfaceCopy.js +26 -26
- package/dist/types.d.ts +15 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical `ScanResult.repoIntelligence` wire contract (Wave 1 + Wave 2).
|
|
3
|
+
*
|
|
4
|
+
* Bump {@link REPO_INTELLIGENCE_ABI} when this schema changes incompatibly.
|
|
5
|
+
* Engine maps internal signals to this shape at emit time; consumers must use
|
|
6
|
+
* {@link safeParseRepoIntelligence} and honor `analysisPreparation.repoIntelligenceValidation`.
|
|
7
|
+
*/
|
|
1
8
|
import { z } from "zod";
|
|
9
|
+
/** Bump when wire schema changes incompatibly. */
|
|
10
|
+
export const REPO_INTELLIGENCE_ABI = "1";
|
|
2
11
|
const surfaceKindSchema = z.enum(["runtime", "build", "test", "unknown"]);
|
|
3
12
|
const reachabilityKindSchema = z.enum([
|
|
4
13
|
"on_runtime_paths",
|
|
@@ -8,163 +17,112 @@ const reachabilityKindSchema = z.enum([
|
|
|
8
17
|
"unknown",
|
|
9
18
|
]);
|
|
10
19
|
const blastLevelSchema = z.enum(["narrow", "moderate", "wide"]);
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
z.string(),
|
|
14
|
-
z.object({ kind: z.string() }).passthrough(),
|
|
15
|
-
]);
|
|
16
|
-
const looseReachabilitySchema = z.union([
|
|
17
|
-
reachabilityKindSchema,
|
|
18
|
-
z.string(),
|
|
19
|
-
z.object({ kind: z.string() }).passthrough(),
|
|
20
|
-
]);
|
|
21
|
-
const packageUsageEntrySchema = z
|
|
22
|
-
.object({
|
|
23
|
-
packageName: z.string().optional(),
|
|
24
|
-
package: z.string().optional(),
|
|
25
|
-
files: z.array(z.string()).optional(),
|
|
20
|
+
const packageUsageWireSchema = z.object({
|
|
21
|
+
packageName: z.string().min(1),
|
|
22
|
+
files: z.array(z.string()),
|
|
26
23
|
paths: z.array(z.string()).optional(),
|
|
27
24
|
criticalPaths: z.array(z.string()).optional(),
|
|
28
25
|
areas: z.array(z.string()).optional(),
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
reachability: looseReachabilitySchema.optional(),
|
|
35
|
-
packageUsage: packageUsageEntrySchema.optional(),
|
|
36
|
-
usage: packageUsageEntrySchema.optional(),
|
|
26
|
+
});
|
|
27
|
+
const packageIntelWireSchema = z.object({
|
|
28
|
+
runtimeSurface: surfaceKindSchema,
|
|
29
|
+
reachability: reachabilityKindSchema,
|
|
30
|
+
usage: packageUsageWireSchema,
|
|
37
31
|
areas: z.array(z.string()).optional(),
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
export const
|
|
56
|
-
.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
blastRadius: z
|
|
60
|
-
.object({
|
|
61
|
-
level: blastLevelSchema.optional(),
|
|
62
|
-
factors: z.array(z.string()).optional(),
|
|
63
|
-
changedPackageCount: z.number().optional(),
|
|
64
|
-
})
|
|
65
|
-
.passthrough()
|
|
66
|
-
.optional(),
|
|
67
|
-
runtimeSurface: looseSurfaceSchema.optional(),
|
|
68
|
-
reachability: looseReachabilitySchema.optional(),
|
|
32
|
+
});
|
|
33
|
+
const areaSchema = z.object({
|
|
34
|
+
id: z.string().min(1),
|
|
35
|
+
label: z.string().min(1),
|
|
36
|
+
});
|
|
37
|
+
const hotspotWireSchema = z.object({
|
|
38
|
+
packageName: z.string().min(1),
|
|
39
|
+
source: z.enum(["code", "graph"]).optional(),
|
|
40
|
+
depth: z.number().optional(),
|
|
41
|
+
paths: z.array(z.string()),
|
|
42
|
+
});
|
|
43
|
+
const blastRadiusWireSchema = z.object({
|
|
44
|
+
level: blastLevelSchema,
|
|
45
|
+
factors: z.array(z.string()).optional(),
|
|
46
|
+
changedPackageCount: z.number().int().nonnegative().optional(),
|
|
47
|
+
});
|
|
48
|
+
/** Strict canonical wire schema — single source of truth. */
|
|
49
|
+
export const repoIntelligenceWireSchema = z.object({
|
|
50
|
+
packages: z.record(z.string(), packageIntelWireSchema),
|
|
51
|
+
packageUsage: z.array(packageUsageWireSchema).optional(),
|
|
52
|
+
blastRadius: blastRadiusWireSchema.optional(),
|
|
69
53
|
applicationAreas: z.array(areaSchema).optional(),
|
|
70
54
|
affectedAreas: z.array(areaSchema).optional(),
|
|
71
|
-
hotspots: z
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
})
|
|
79
|
-
.passthrough())
|
|
80
|
-
.optional(),
|
|
81
|
-
frameworks: z.array(z.string()).optional(),
|
|
82
|
-
})
|
|
83
|
-
.passthrough();
|
|
84
|
-
export function parseRepoIntelligence(raw) {
|
|
55
|
+
hotspots: z.array(hotspotWireSchema).optional(),
|
|
56
|
+
frameworks: z.array(z.string().min(1)).optional(),
|
|
57
|
+
});
|
|
58
|
+
function formatZodIssues(error) {
|
|
59
|
+
return error.issues.map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`);
|
|
60
|
+
}
|
|
61
|
+
export function countRepoIntelligencePackages(raw) {
|
|
85
62
|
if (raw == null || typeof raw !== "object")
|
|
86
|
-
return
|
|
87
|
-
const
|
|
88
|
-
if (
|
|
89
|
-
return
|
|
90
|
-
|
|
91
|
-
if (
|
|
92
|
-
return
|
|
93
|
-
if (Object.keys(value).length === 1 &&
|
|
94
|
-
value.packages &&
|
|
95
|
-
Object.keys(value.packages).length === 0) {
|
|
96
|
-
return null;
|
|
63
|
+
return 0;
|
|
64
|
+
const obj = raw;
|
|
65
|
+
if (obj.packages != null && typeof obj.packages === "object") {
|
|
66
|
+
return Object.keys(obj.packages).length;
|
|
67
|
+
}
|
|
68
|
+
if (Array.isArray(obj.packageUsage)) {
|
|
69
|
+
return obj.packageUsage.length;
|
|
97
70
|
}
|
|
98
|
-
return
|
|
71
|
+
return 0;
|
|
99
72
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
[/\bjest\b/i, "test"],
|
|
110
|
-
];
|
|
111
|
-
const REACHABILITY_ALIASES = [
|
|
112
|
-
[/\bon[_\s-]?runtime/i, "on_runtime_paths"],
|
|
113
|
-
[/\bruntime[_\s-]?path/i, "on_runtime_paths"],
|
|
114
|
-
[/\bdirect\b/i, "on_runtime_paths"],
|
|
115
|
-
[/\bbuild[_\s-]?only/i, "build_only"],
|
|
116
|
-
[/\btest[_\s-]?only/i, "test_only"],
|
|
117
|
-
[/\bunreachable\b/i, "unreachable"],
|
|
118
|
-
];
|
|
119
|
-
export function normalizeRuntimeSurfaceKind(raw) {
|
|
120
|
-
if (!raw?.trim())
|
|
121
|
-
return "unknown";
|
|
122
|
-
const t = raw.trim().toLowerCase();
|
|
123
|
-
if (t === "runtime" || t === "build" || t === "test" || t === "unknown") {
|
|
124
|
-
return t;
|
|
73
|
+
export function safeParseRepoIntelligence(raw) {
|
|
74
|
+
const packageCount = countRepoIntelligencePackages(raw);
|
|
75
|
+
if (raw == null || typeof raw !== "object") {
|
|
76
|
+
return {
|
|
77
|
+
ok: false,
|
|
78
|
+
issues: ["(root): expected object"],
|
|
79
|
+
issueCount: 1,
|
|
80
|
+
packageCount: 0,
|
|
81
|
+
};
|
|
125
82
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
83
|
+
const parsed = repoIntelligenceWireSchema.safeParse(raw);
|
|
84
|
+
if (!parsed.success) {
|
|
85
|
+
const issues = formatZodIssues(parsed.error);
|
|
86
|
+
return {
|
|
87
|
+
ok: false,
|
|
88
|
+
issues,
|
|
89
|
+
issueCount: issues.length,
|
|
90
|
+
packageCount,
|
|
91
|
+
};
|
|
129
92
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
t === "test_only" ||
|
|
139
|
-
t === "unreachable" ||
|
|
140
|
-
t === "unknown") {
|
|
141
|
-
return t;
|
|
93
|
+
const value = parsed.data;
|
|
94
|
+
if (Object.keys(value).length === 0) {
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
issues: ["(root): empty object"],
|
|
98
|
+
issueCount: 1,
|
|
99
|
+
packageCount: 0,
|
|
100
|
+
};
|
|
142
101
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
102
|
+
if (Object.keys(value.packages).length === 0 &&
|
|
103
|
+
(value.packageUsage?.length ?? 0) === 0) {
|
|
104
|
+
return {
|
|
105
|
+
ok: false,
|
|
106
|
+
issues: ["packages: at least one package required"],
|
|
107
|
+
issueCount: 1,
|
|
108
|
+
packageCount: 0,
|
|
109
|
+
};
|
|
146
110
|
}
|
|
147
|
-
return
|
|
111
|
+
return { ok: true, value };
|
|
148
112
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (
|
|
153
|
-
|
|
154
|
-
if (typeof value === "object" && "kind" in value) {
|
|
155
|
-
return normalizeRuntimeSurfaceKind(String(value.kind));
|
|
113
|
+
/** Throws when wire block is present but invalid (CI / tests only). */
|
|
114
|
+
export function validateRepoIntelligenceWire(raw) {
|
|
115
|
+
const r = safeParseRepoIntelligence(raw);
|
|
116
|
+
if (!r.ok) {
|
|
117
|
+
throw new Error(`repoIntelligence contract: ${r.issues.join("; ")}`);
|
|
156
118
|
}
|
|
157
|
-
return
|
|
119
|
+
return r.value;
|
|
158
120
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
if (typeof value === "object" && "kind" in value) {
|
|
165
|
-
return normalizeReachabilityKind(String(value.kind));
|
|
166
|
-
}
|
|
167
|
-
return null;
|
|
121
|
+
/** CI helper — fails test when engine output includes invalid repoIntelligence. */
|
|
122
|
+
export function assertEngineOutputRepoIntelligenceValid(scan) {
|
|
123
|
+
if (scan.repoIntelligence == null)
|
|
124
|
+
return;
|
|
125
|
+
validateRepoIntelligenceWire(scan.repoIntelligence);
|
|
168
126
|
}
|
|
169
127
|
export function readBlastLevel(level) {
|
|
170
128
|
if (level === "narrow" || level === "moderate" || level === "wide") {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ScanResult } from "./types.js";
|
|
2
|
+
export type RepoIntelligenceContractLogPayload = {
|
|
3
|
+
issueCount: number;
|
|
4
|
+
representativeIssues: string[];
|
|
5
|
+
packageCount: number;
|
|
6
|
+
methodologyVersion?: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Non-blocking production gate: validate repoIntelligence, attach metadata, retain raw payload.
|
|
10
|
+
*/
|
|
11
|
+
export declare function applyRepoIntelligenceValidation(result: ScanResult, options?: {
|
|
12
|
+
validatedAt?: string;
|
|
13
|
+
}): {
|
|
14
|
+
result: ScanResult;
|
|
15
|
+
contractFailed: boolean;
|
|
16
|
+
logPayload?: RepoIntelligenceContractLogPayload;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=repoIntelligenceValidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repoIntelligenceValidation.d.ts","sourceRoot":"","sources":["../src/repoIntelligenceValidation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,UAAU,EACX,MAAM,YAAY,CAAC;AAOpB,MAAM,MAAM,kCAAkC,GAAG;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAIF;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IACD,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,kCAAkC,CAAC;CACjD,CAqFA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { REPO_INTELLIGENCE_ABI, countRepoIntelligencePackages, safeParseRepoIntelligence, } from "./repoIntelligenceSchema.js";
|
|
2
|
+
const MAX_REPRESENTATIVE_ISSUES = 5;
|
|
3
|
+
/**
|
|
4
|
+
* Non-blocking production gate: validate repoIntelligence, attach metadata, retain raw payload.
|
|
5
|
+
*/
|
|
6
|
+
export function applyRepoIntelligenceValidation(result, options) {
|
|
7
|
+
const validatedAt = options?.validatedAt ?? new Date().toISOString();
|
|
8
|
+
const raw = result.repoIntelligence;
|
|
9
|
+
if (raw == null ||
|
|
10
|
+
(typeof raw === "object" && Object.keys(raw).length === 0)) {
|
|
11
|
+
const analysisPreparation = {
|
|
12
|
+
...result.analysisPreparation,
|
|
13
|
+
codeIntelligenceAvailable: result.analysisPreparation?.codeIntelligenceAvailable ?? false,
|
|
14
|
+
warnings: result.analysisPreparation?.warnings ?? [],
|
|
15
|
+
repoIntelligenceValidation: {
|
|
16
|
+
status: "absent",
|
|
17
|
+
abi: REPO_INTELLIGENCE_ABI,
|
|
18
|
+
validatedAt,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
result: { ...result, analysisPreparation },
|
|
23
|
+
contractFailed: false,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const parsed = safeParseRepoIntelligence(raw);
|
|
27
|
+
const packageCount = countRepoIntelligencePackages(raw);
|
|
28
|
+
if (parsed.ok) {
|
|
29
|
+
const analysisPreparation = {
|
|
30
|
+
...result.analysisPreparation,
|
|
31
|
+
codeIntelligenceAvailable: result.analysisPreparation?.codeIntelligenceAvailable ?? true,
|
|
32
|
+
warnings: result.analysisPreparation?.warnings ?? [],
|
|
33
|
+
repoIntelligenceValidation: {
|
|
34
|
+
status: "valid",
|
|
35
|
+
abi: REPO_INTELLIGENCE_ABI,
|
|
36
|
+
validatedAt,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
result: { ...result, analysisPreparation },
|
|
41
|
+
contractFailed: false,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const representativeIssues = parsed.issues.slice(0, MAX_REPRESENTATIVE_ISSUES);
|
|
45
|
+
const warning = {
|
|
46
|
+
code: "repo_intelligence_contract_invalid",
|
|
47
|
+
message: "Repository intelligence block failed contract validation; narrative uses graph fallback.",
|
|
48
|
+
details: {
|
|
49
|
+
issueCount: parsed.issueCount,
|
|
50
|
+
representativeIssues,
|
|
51
|
+
abi: REPO_INTELLIGENCE_ABI,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
const analysisPreparation = {
|
|
55
|
+
...result.analysisPreparation,
|
|
56
|
+
codeIntelligenceAvailable: result.analysisPreparation?.codeIntelligenceAvailable ?? true,
|
|
57
|
+
warnings: [...(result.analysisPreparation?.warnings ?? []), warning],
|
|
58
|
+
repoIntelligenceValidation: {
|
|
59
|
+
status: "invalid",
|
|
60
|
+
abi: REPO_INTELLIGENCE_ABI,
|
|
61
|
+
issueCount: parsed.issueCount,
|
|
62
|
+
representativeIssues,
|
|
63
|
+
validatedAt,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
return {
|
|
67
|
+
result: { ...result, repoIntelligence: raw, analysisPreparation },
|
|
68
|
+
contractFailed: true,
|
|
69
|
+
logPayload: {
|
|
70
|
+
issueCount: parsed.issueCount,
|
|
71
|
+
representativeIssues,
|
|
72
|
+
packageCount,
|
|
73
|
+
methodologyVersion: result.methodologyVersion,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repoIntelligenceValidation.persist.test.d.ts","sourceRoot":"","sources":["../src/repoIntelligenceValidation.persist.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { deriveScanNarrative } from "./deriveScanNarrative.js";
|
|
3
|
+
import { legacyEngineRepoIntelligenceJwt } from "./fixtures/legacyEngineRepoIntelligence.js";
|
|
4
|
+
import { applyRepoIntelligenceValidation } from "./repoIntelligenceValidation.js";
|
|
5
|
+
const baseScan = {
|
|
6
|
+
totalScore: 40,
|
|
7
|
+
layerScores: {
|
|
8
|
+
security: 10,
|
|
9
|
+
maintainability: 10,
|
|
10
|
+
ecosystem: 10,
|
|
11
|
+
upgradeImpact: 10,
|
|
12
|
+
},
|
|
13
|
+
findings: [],
|
|
14
|
+
generatedAt: "2026-01-01T00:00:00.000Z",
|
|
15
|
+
changedPackages: ["jsonwebtoken"],
|
|
16
|
+
analysisPreparation: {
|
|
17
|
+
codeIntelligenceAvailable: true,
|
|
18
|
+
warnings: [],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
describe("applyRepoIntelligenceValidation (production persist model)", () => {
|
|
22
|
+
it("retains raw invalid repoIntelligence and marks status invalid", () => {
|
|
23
|
+
const { result, contractFailed, logPayload } = applyRepoIntelligenceValidation({
|
|
24
|
+
...baseScan,
|
|
25
|
+
repoIntelligence: legacyEngineRepoIntelligenceJwt,
|
|
26
|
+
});
|
|
27
|
+
expect(contractFailed).toBe(true);
|
|
28
|
+
expect(logPayload?.issueCount).toBeGreaterThan(0);
|
|
29
|
+
expect(result.repoIntelligence).toEqual(legacyEngineRepoIntelligenceJwt);
|
|
30
|
+
expect(result.analysisPreparation?.repoIntelligenceValidation?.status).toBe("invalid");
|
|
31
|
+
expect(result.analysisPreparation?.warnings.some((w) => w.code === "repo_intelligence_contract_invalid")).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
it("deriveScanNarrative ignores invalid wire (graph_fallback, untrusted parse status)", () => {
|
|
34
|
+
const { result } = applyRepoIntelligenceValidation({
|
|
35
|
+
...baseScan,
|
|
36
|
+
repoIntelligence: legacyEngineRepoIntelligenceJwt,
|
|
37
|
+
});
|
|
38
|
+
const facts = deriveScanNarrative(result);
|
|
39
|
+
expect(facts.availability.repoIntelligenceParse).toBe("untrusted");
|
|
40
|
+
expect(facts.availability.tiersPresent.tier1).toBe(false);
|
|
41
|
+
expect(facts.availability.mode).not.toBe("pr_intelligence");
|
|
42
|
+
expect(facts.packageUsage).toHaveLength(0);
|
|
43
|
+
});
|
|
44
|
+
});
|
package/dist/riskVocabulary.js
CHANGED
|
@@ -34,7 +34,7 @@ export function mergePostureFromDecision(decision) {
|
|
|
34
34
|
return null;
|
|
35
35
|
}
|
|
36
36
|
/** Returns the display label for a decision, or a fallback string. */
|
|
37
|
-
export function mergePostureLabel(decision, fallback = "
|
|
37
|
+
export function mergePostureLabel(decision, fallback = "-") {
|
|
38
38
|
const posture = mergePostureFromDecision(decision);
|
|
39
39
|
return posture ? MERGE_POSTURE_LABEL[posture] : fallback;
|
|
40
40
|
}
|
|
@@ -34,8 +34,16 @@ export type ScanCardSummary = {
|
|
|
34
34
|
affectedAreas: string[];
|
|
35
35
|
primaryInsight: string | null;
|
|
36
36
|
structuralOnlyDisclaimer: string | null;
|
|
37
|
+
/** One-line usage hint from packageUsage paths or areas. */
|
|
38
|
+
usageSummary: string | null;
|
|
39
|
+
/** Single verification prompt from changed-scope guidance or usage. */
|
|
40
|
+
verificationLine: string | null;
|
|
41
|
+
/** Optional blast factor subline when factors exist. */
|
|
42
|
+
blastRadiusDetail: string | null;
|
|
43
|
+
/** Short framework list (max 2 on card). */
|
|
44
|
+
frameworksSummary: string | null;
|
|
37
45
|
};
|
|
38
|
-
export declare const SCAN_CARD_SCANNING_SUMMARY = "Waiting for results
|
|
46
|
+
export declare const SCAN_CARD_SCANNING_SUMMARY = "Waiting for results...";
|
|
39
47
|
export type PipelineCompletionEvidence = {
|
|
40
48
|
scannedAt?: string | null;
|
|
41
49
|
decision?: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanCardSummary.d.ts","sourceRoot":"","sources":["../src/scanCardSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1E,MAAM,MAAM,yBAAyB,GACjC,aAAa,GACb,UAAU,GACV,iBAAiB,GACjB,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEtD,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C,oCAAoC;IACpC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,2FAA2F;IAC3F,uBAAuB,EAAE,aAAa,EAAE,CAAC;IACzC,oEAAoE;IACpE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,yBAAyB,CAAC;IACzC,yBAAyB,EAAE,OAAO,CAAC;IACnC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"scanCardSummary.d.ts","sourceRoot":"","sources":["../src/scanCardSummary.ts"],"names":[],"mappings":"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"}
|
package/dist/scanCardSummary.js
CHANGED
|
@@ -3,7 +3,7 @@ import { presentScanCardSummary } from "./presentScanCardSummary.js";
|
|
|
3
3
|
import { mergePostureFromDecision, } from "./riskVocabulary.js";
|
|
4
4
|
import { scanSurfaceCopy } from "./scanSurfaceCopy.js";
|
|
5
5
|
const STALE_SUBLINE = "Based on earlier commit";
|
|
6
|
-
export const SCAN_CARD_SCANNING_SUMMARY = "Waiting for results
|
|
6
|
+
export const SCAN_CARD_SCANNING_SUMMARY = "Waiting for results...";
|
|
7
7
|
function normalizePipelineStatus(status) {
|
|
8
8
|
const st = String(status ?? "")
|
|
9
9
|
.trim()
|
|
@@ -11,6 +11,10 @@ const pipelinePresentationDefaults = {
|
|
|
11
11
|
affectedAreas: [],
|
|
12
12
|
primaryInsight: null,
|
|
13
13
|
structuralOnlyDisclaimer: null,
|
|
14
|
+
usageSummary: null,
|
|
15
|
+
verificationLine: null,
|
|
16
|
+
blastRadiusDetail: null,
|
|
17
|
+
frameworksSummary: null,
|
|
14
18
|
};
|
|
15
19
|
const baseResult = {
|
|
16
20
|
totalScore: 10,
|
|
@@ -64,7 +68,7 @@ describe("deriveScanCardSummary", () => {
|
|
|
64
68
|
it("returns scanning copy for queued/running", () => {
|
|
65
69
|
const queued = deriveScanCardSummary(null, "queued");
|
|
66
70
|
expect(queued.headline).toBe("Scan in progress");
|
|
67
|
-
expect(queued.summaryLine).toBe("Waiting for results
|
|
71
|
+
expect(queued.summaryLine).toBe("Waiting for results...");
|
|
68
72
|
expect(queued.mergePosture).toBeNull();
|
|
69
73
|
const running = deriveScanCardSummary(null, "running");
|
|
70
74
|
expect(running.headline).toBe("Scan in progress");
|
|
@@ -184,7 +188,7 @@ describe("isPipelineCardSummary", () => {
|
|
|
184
188
|
riskIndex: null,
|
|
185
189
|
riskIndexBand: null,
|
|
186
190
|
headline: "Scan in progress",
|
|
187
|
-
summaryLine: "Waiting for results
|
|
191
|
+
summaryLine: "Waiting for results...",
|
|
188
192
|
findingCounts: null,
|
|
189
193
|
topAffectedAreas: [],
|
|
190
194
|
operationalObservations: [],
|
|
@@ -198,7 +202,7 @@ describe("isPipelineCardSummary", () => {
|
|
|
198
202
|
riskIndex: 72,
|
|
199
203
|
riskIndexBand: "high",
|
|
200
204
|
headline: "Risky",
|
|
201
|
-
summaryLine: "Waiting for results
|
|
205
|
+
summaryLine: "Waiting for results...",
|
|
202
206
|
findingCounts: null,
|
|
203
207
|
topAffectedAreas: [],
|
|
204
208
|
operationalObservations: [],
|
|
@@ -209,7 +213,7 @@ describe("isPipelineCardSummary", () => {
|
|
|
209
213
|
});
|
|
210
214
|
describe("isPipelinePlaceholderCopy", () => {
|
|
211
215
|
it("identifies waiting copy", () => {
|
|
212
|
-
expect(isPipelinePlaceholderCopy("Waiting for results
|
|
216
|
+
expect(isPipelinePlaceholderCopy("Waiting for results...")).toBe(true);
|
|
213
217
|
expect(isPipelinePlaceholderCopy("Auth change")).toBe(false);
|
|
214
218
|
});
|
|
215
219
|
});
|
|
@@ -223,9 +227,9 @@ describe("deriveScanCardSummaryFromDenormalized", () => {
|
|
|
223
227
|
expect(summary.operationalObservations).toEqual([]);
|
|
224
228
|
});
|
|
225
229
|
it("does not inject pipeline placeholder summaryText", () => {
|
|
226
|
-
const summary = deriveScanCardSummaryFromDenormalized("risky", 72, "Waiting for results
|
|
230
|
+
const summary = deriveScanCardSummaryFromDenormalized("risky", 72, "Waiting for results...", "done");
|
|
227
231
|
expect(summary.mergePosture).toBe("risky");
|
|
228
|
-
expect(summary.summaryLine).not.toBe("Waiting for results
|
|
232
|
+
expect(summary.summaryLine).not.toBe("Waiting for results...");
|
|
229
233
|
});
|
|
230
234
|
it("does not inject raw generic summaryText on quiet safe cards", () => {
|
|
231
235
|
const summary = deriveScanCardSummaryFromDenormalized("safe", 12, "No high-confidence merge risks from this PR dependency change", "done");
|
|
@@ -239,11 +243,11 @@ describe("resolvePrScanCardSummary", () => {
|
|
|
239
243
|
pipelineStatus: "running",
|
|
240
244
|
decision: "risky",
|
|
241
245
|
totalScore: 80,
|
|
242
|
-
summaryText: "Waiting for results
|
|
246
|
+
summaryText: "Waiting for results...",
|
|
243
247
|
result: null,
|
|
244
248
|
});
|
|
245
249
|
expect(summary.mergePosture).toBe("risky");
|
|
246
250
|
expect(summary.headline).toBe("Risky");
|
|
247
|
-
expect(summary.summaryLine).not.toBe("Waiting for results
|
|
251
|
+
expect(summary.summaryLine).not.toBe("Waiting for results...");
|
|
248
252
|
});
|
|
249
253
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ScanNarrativeFacts } from "./scanNarrativeFacts.js";
|
|
1
2
|
import { type ScanDetailRecommendationCenter } from "./deriveScanDetailRecommendations.js";
|
|
2
3
|
import { type ScanDetailSignalSummary } from "./deriveRiskScoreSummary.js";
|
|
3
4
|
import { type MergePosture } from "./riskVocabulary.js";
|
|
@@ -66,6 +67,12 @@ export type ScanDetailNarrativeContext = {
|
|
|
66
67
|
blastRadiusLabel: string | null;
|
|
67
68
|
affectedAreas: string[];
|
|
68
69
|
structuralOnlyDisclaimer: string | null;
|
|
70
|
+
usageHighlights: string[];
|
|
71
|
+
frameworks: string[];
|
|
72
|
+
blastRadiusFactors: string[];
|
|
73
|
+
hotspotNames: string[];
|
|
74
|
+
usageContextLine: string | null;
|
|
75
|
+
upgradeContextLine: string | null;
|
|
69
76
|
};
|
|
70
77
|
export type ScanDetailViewModel = {
|
|
71
78
|
verdict: ScanDetailVerdict;
|
|
@@ -114,8 +121,9 @@ export declare function sanitizeAct2Theme(raw: string): string | null;
|
|
|
114
121
|
export declare function deriveVerdictLine(posture: MergePosture | null, totalScore: number | null | undefined): string;
|
|
115
122
|
export declare function deriveAct2Themes(result: ScanResult): string[];
|
|
116
123
|
export declare function deriveOperationalImpact(result: ScanResult, verifyLabels?: Set<string>): ScanDetailOperationalImpact;
|
|
124
|
+
export declare function presentScanDetailNarrativeContext(facts: ScanNarrativeFacts): ScanDetailNarrativeContext;
|
|
117
125
|
/** Scan detail presentation from shared narrative facts. */
|
|
118
|
-
export declare function presentScanDetailViewModel(facts:
|
|
126
|
+
export declare function presentScanDetailViewModel(facts: ScanNarrativeFacts, result: ScanResult, options: DeriveScanDetailOptions): ScanDetailViewModel;
|
|
119
127
|
export declare function deriveScanDetailViewModel(result: ScanResult | null | undefined, options: DeriveScanDetailOptions): ScanDetailViewModel | null;
|
|
120
128
|
/** Tier 1 recall test helper — true when message describes application-level impact. */
|
|
121
129
|
export declare function tier1PassesRecallTest(operationalImpact: ScanDetailOperationalImpact): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanDetailViewModel.d.ts","sourceRoot":"","sources":["../src/scanDetailViewModel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scanDetailViewModel.d.ts","sourceRoot":"","sources":["../src/scanDetailViewModel.ts"],"names":[],"mappings":"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"}
|