@mergesignal/shared 0.8.2 → 0.9.1
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/deriveScanNarrative.test.js +2 -2
- package/dist/fixtures/engineAbi4Fixtures.d.ts +16 -0
- package/dist/fixtures/engineAbi4Fixtures.d.ts.map +1 -0
- package/dist/fixtures/engineAbi4Fixtures.js +26 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/prRiskBand.d.ts +23 -0
- package/dist/prRiskBand.d.ts.map +1 -0
- package/dist/prRiskBand.js +66 -0
- package/dist/prRiskBand.test.d.ts +2 -0
- package/dist/prRiskBand.test.d.ts.map +1 -0
- package/dist/prRiskBand.test.js +57 -0
- package/dist/prRiskWire.d.ts +57 -0
- package/dist/prRiskWire.d.ts.map +1 -0
- package/dist/prRiskWire.js +98 -0
- package/dist/prRiskWire.test.d.ts +2 -0
- package/dist/prRiskWire.test.d.ts.map +1 -0
- package/dist/prRiskWire.test.js +106 -0
- package/dist/prRiskWiringRegression.test.d.ts +2 -0
- package/dist/prRiskWiringRegression.test.d.ts.map +1 -0
- package/dist/prRiskWiringRegression.test.js +102 -0
- package/dist/presentGitHubPrComment.d.ts.map +1 -1
- package/dist/presentGitHubPrComment.js +0 -1
- package/dist/presentation/dto/githubAndCliPresentation.d.ts +3 -0
- package/dist/presentation/dto/githubAndCliPresentation.d.ts.map +1 -1
- package/dist/presentation/dto/scanDetailsPresentation.d.ts +5 -2
- package/dist/presentation/dto/scanDetailsPresentation.d.ts.map +1 -1
- package/dist/presentation/fixtures/presentationPersonaFixtures.d.ts.map +1 -1
- package/dist/presentation/fixtures/presentationPersonaFixtures.js +5 -1
- package/dist/presentation/fixtures/scanResultFixtures.d.ts.map +1 -1
- package/dist/presentation/fixtures/scanResultFixtures.js +28 -17
- package/dist/presentation/orchestration/buildScanCardPresentation.d.ts +2 -1
- package/dist/presentation/orchestration/buildScanCardPresentation.d.ts.map +1 -1
- package/dist/presentation/orchestration/buildScanCardPresentation.js +7 -6
- package/dist/presentation/orchestration/buildScanDetailsPresentation.d.ts +1 -1
- package/dist/presentation/orchestration/buildScanDetailsPresentation.d.ts.map +1 -1
- package/dist/presentation/orchestration/buildScanDetailsPresentation.js +0 -1
- package/dist/presentation/orchestration/buildScanPresentationBundle.d.ts +0 -1
- package/dist/presentation/orchestration/buildScanPresentationBundle.d.ts.map +1 -1
- package/dist/presentation/presenters/presentCliScanSummary.d.ts.map +1 -1
- package/dist/presentation/presenters/presentCliScanSummary.js +9 -4
- package/dist/presentation/presenters/presentDashboardCard.d.ts.map +1 -1
- package/dist/presentation/presenters/presentDashboardCard.js +3 -2
- package/dist/presentation/presenters/presentGitHubCheckRun.d.ts.map +1 -1
- package/dist/presentation/presenters/presentGitHubCheckRun.js +10 -0
- package/dist/presentation/presenters/presentGitHubPrComment.d.ts.map +1 -1
- package/dist/presentation/presenters/presentGitHubPrComment.js +6 -0
- package/dist/presentation/presenters/presentScanDetails.d.ts.map +1 -1
- package/dist/presentation/presenters/presentScanDetails.js +46 -3
- package/dist/presentation/render/renderCliScanSummaryText.d.ts.map +1 -1
- package/dist/presentation/render/renderCliScanSummaryText.js +4 -1
- package/dist/productMessaging.d.ts +2 -2
- package/dist/productMessaging.d.ts.map +1 -1
- package/dist/productMessaging.js +3 -3
- package/dist/productMessaging.test.js +6 -6
- package/dist/resolvePipelineStatus.d.ts +4 -3
- package/dist/resolvePipelineStatus.d.ts.map +1 -1
- package/dist/resolvePipelineStatus.js +3 -3
- package/dist/riskSignals.d.ts +6 -6
- package/dist/riskSignals.d.ts.map +1 -1
- package/dist/riskSignals.js +9 -10
- package/dist/riskSignals.test.d.ts +2 -0
- package/dist/riskSignals.test.d.ts.map +1 -0
- package/dist/riskSignals.test.js +32 -0
- package/dist/riskVocabulary.js +7 -7
- package/dist/scanPresentationBundle.golden.test.js +4 -4
- package/dist/scanResultSchema.d.ts +42 -1
- package/dist/scanResultSchema.d.ts.map +1 -1
- package/dist/scanResultSchema.js +35 -2
- package/dist/scanResultSchema.test.js +15 -2
- package/dist/scanSurfaceCopy.d.ts +4 -2
- package/dist/scanSurfaceCopy.d.ts.map +1 -1
- package/dist/scanSurfaceCopy.js +4 -2
- package/dist/trustedScanGuards.test.js +3 -2
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/formatCardExposureDisplay.d.ts +0 -22
- package/dist/formatCardExposureDisplay.d.ts.map +0 -1
- package/dist/formatCardExposureDisplay.js +0 -63
- package/dist/formatCardExposureDisplay.test.d.ts +0 -2
- package/dist/formatCardExposureDisplay.test.d.ts.map +0 -1
- package/dist/formatCardExposureDisplay.test.js +0 -44
|
@@ -44,6 +44,9 @@ export type CliScanPresentation = AssessmentPresentationFields & {
|
|
|
44
44
|
keyPoints: string[];
|
|
45
45
|
verificationActions: string[];
|
|
46
46
|
metrics?: {
|
|
47
|
+
prRiskScore: number;
|
|
48
|
+
prRiskBandLabel?: string;
|
|
49
|
+
/** @deprecated Use prRiskScore */
|
|
47
50
|
riskIndex: number;
|
|
48
51
|
layerLine: string;
|
|
49
52
|
findingCount: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"githubAndCliPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/githubAndCliPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,0BAA0B,GAAG,4BAA4B,GAAG;IACtE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACtE,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,4BAA4B,GAAG;IACvE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,KAAK,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,4BAA4B,GAAG;IAC/D,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,CAAC"}
|
|
1
|
+
{"version":3,"file":"githubAndCliPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/githubAndCliPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,0BAA0B,GAAG,4BAA4B,GAAG;IACtE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACtE,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,4BAA4B,GAAG;IACvE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,KAAK,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,4BAA4B,GAAG;IAC/D,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kCAAkC;QAClC,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,CAAC"}
|
|
@@ -13,6 +13,9 @@ export type ScanDetailsPresentation = AssessmentPresentationFields & {
|
|
|
13
13
|
verdictLine: string;
|
|
14
14
|
scopeChip?: string;
|
|
15
15
|
postureLabel: string;
|
|
16
|
+
prRiskScore?: number | null;
|
|
17
|
+
prRiskBandLabel?: string;
|
|
18
|
+
/** @deprecated Use prRiskScore */
|
|
16
19
|
riskIndex?: number | null;
|
|
17
20
|
};
|
|
18
21
|
narrative: {
|
|
@@ -38,12 +41,12 @@ export type ScanDetailsPresentation = AssessmentPresentationFields & {
|
|
|
38
41
|
}>;
|
|
39
42
|
};
|
|
40
43
|
signalSummary?: {
|
|
41
|
-
|
|
44
|
+
prRiskScore: number;
|
|
42
45
|
band: "low" | "medium" | "high";
|
|
43
46
|
layers: Array<{
|
|
44
47
|
layer: ScoreLayer;
|
|
45
48
|
score: number;
|
|
46
|
-
band:
|
|
49
|
+
band: "low" | "medium" | "high";
|
|
47
50
|
label: string;
|
|
48
51
|
}>;
|
|
49
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanDetailsPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/scanDetailsPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAElE,MAAM,MAAM,uBAAuB,GAAG,4BAA4B,GAAG;IACnE,eAAe,EAAE,2BAA2B,CAAC;IAC7C,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IAEnC,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC;IAEF,SAAS,EAAE;QACT,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IAEF,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,KAAK,CAAC;YACX,WAAW,EAAE,MAAM,CAAC;YACpB,KAAK,EAAE,MAAM,EAAE,CAAC;YAChB,KAAK,EAAE,MAAM,EAAE,CAAC;YAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;SAC1B,CAAC,CAAC;QACH,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IAEF,YAAY,EAAE;QACZ,OAAO,EAAE,KAAK,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;SAC1B,CAAC,CAAC;KACJ,CAAC;IAEF,aAAa,CAAC,EAAE;QACd,
|
|
1
|
+
{"version":3,"file":"scanDetailsPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/scanDetailsPresentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentationPersonaFixtures.d.ts","sourceRoot":"","sources":["../../../src/presentation/fixtures/presentationPersonaFixtures.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"presentationPersonaFixtures.d.ts","sourceRoot":"","sources":["../../../src/presentation/fixtures/presentationPersonaFixtures.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAmBjD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AA+KjC,eAAO,MAAM,gBAAgB,EAAE,UAG7B,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,UAShC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,UAG7B,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,UAI/B,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,UAa7B,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,UAMnC,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,UAO9C,CAAC;AAEF,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,GAC1B,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { assessmentBullmq, assessmentEslint, assessmentMixedTypescriptFastify, assessmentNextAuth, assessmentPrettier, assessmentUnknownSafe, assessmentVitest, } from "../../fixtures/assessmentFixtures.js";
|
|
2
2
|
import { fixtureRepoIntelligenceFastify, fixtureRepoIntelligenceTypescript, } from "../../fixtures/repoIntelligenceFixtures.js";
|
|
3
|
+
import { withAbi4SplitScores } from "../../fixtures/engineAbi4Fixtures.js";
|
|
3
4
|
import { analysisPreparationWithValidRepoIntel } from "../../fixtures/repoIntelligenceTestHelpers.js";
|
|
4
5
|
import { scanResultFastifyRuntime, scanResultLimitedContext, scanResultTypescriptPatch, } from "./scanResultFixtures.js";
|
|
5
6
|
const basePrep = analysisPreparationWithValidRepoIntel();
|
|
@@ -165,9 +166,12 @@ export const scanResultEslint = scanBase(assessmentEslint, {
|
|
|
165
166
|
changedPackages: ["eslint"],
|
|
166
167
|
repoIntelligence: fixtureRepoIntelligenceEslint,
|
|
167
168
|
});
|
|
168
|
-
export const scanResultPrettier = scanBase(assessmentPrettier, {
|
|
169
|
+
export const scanResultPrettier = withAbi4SplitScores(scanBase(assessmentPrettier, {
|
|
169
170
|
changedPackages: ["prettier"],
|
|
170
171
|
repoIntelligence: fixtureRepoIntelligencePrettier,
|
|
172
|
+
}), {
|
|
173
|
+
prRiskScore: 30,
|
|
174
|
+
repositoryHealthScore: 61,
|
|
171
175
|
});
|
|
172
176
|
export const scanResultVitest = scanBase(assessmentVitest, {
|
|
173
177
|
changedPackages: ["vitest"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanResultFixtures.d.ts","sourceRoot":"","sources":["../../../src/presentation/fixtures/scanResultFixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"scanResultFixtures.d.ts","sourceRoot":"","sources":["../../../src/presentation/fixtures/scanResultFixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAoBjD,eAAO,MAAM,wBAAwB,EAAE,UA4CtC,CAAC;AASF,eAAO,MAAM,yBAAyB,EAAE,UA6BvC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,UAqCtC,CAAC"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
+
import { withAbi4SplitScores } from "../../fixtures/engineAbi4Fixtures.js";
|
|
1
2
|
import { assessmentFastifyRuntime, assessmentLimitedContext, assessmentTypescriptPatch, } from "../../fixtures/assessmentFixtures.js";
|
|
2
3
|
import { fixtureRepoIntelligenceFastify, fixtureRepoIntelligenceTypescript, } from "../../fixtures/repoIntelligenceFixtures.js";
|
|
3
4
|
import { analysisPreparationWithValidRepoIntel } from "../../fixtures/repoIntelligenceTestHelpers.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
const fastifyLayerScores = {
|
|
6
|
+
security: 10,
|
|
7
|
+
maintainability: 20,
|
|
8
|
+
ecosystem: 30,
|
|
9
|
+
upgradeImpact: 15,
|
|
10
|
+
};
|
|
11
|
+
export const scanResultFastifyRuntime = withAbi4SplitScores({
|
|
12
|
+
totalScore: 63,
|
|
13
|
+
layerScores: fastifyLayerScores,
|
|
12
14
|
findings: [
|
|
13
15
|
{
|
|
14
16
|
id: "finding-fastify-runtime",
|
|
@@ -43,15 +45,20 @@ export const scanResultFastifyRuntime = {
|
|
|
43
45
|
remediation: "Run auth smoke tests",
|
|
44
46
|
},
|
|
45
47
|
],
|
|
48
|
+
}, {
|
|
49
|
+
prRiskScore: 55,
|
|
50
|
+
repositoryHealthScore: 63,
|
|
51
|
+
layerScores: fastifyLayerScores,
|
|
52
|
+
});
|
|
53
|
+
const typescriptLayerScores = {
|
|
54
|
+
security: 5,
|
|
55
|
+
maintainability: 8,
|
|
56
|
+
ecosystem: 10,
|
|
57
|
+
upgradeImpact: 5,
|
|
46
58
|
};
|
|
47
|
-
export const scanResultTypescriptPatch = {
|
|
48
|
-
totalScore:
|
|
49
|
-
layerScores:
|
|
50
|
-
security: 5,
|
|
51
|
-
maintainability: 8,
|
|
52
|
-
ecosystem: 10,
|
|
53
|
-
upgradeImpact: 5,
|
|
54
|
-
},
|
|
59
|
+
export const scanResultTypescriptPatch = withAbi4SplitScores({
|
|
60
|
+
totalScore: 63,
|
|
61
|
+
layerScores: typescriptLayerScores,
|
|
55
62
|
findings: [],
|
|
56
63
|
generatedAt: "2026-01-01T00:00:00.000Z",
|
|
57
64
|
changedPackages: ["typescript"],
|
|
@@ -71,7 +78,11 @@ export const scanResultTypescriptPatch = {
|
|
|
71
78
|
edges: 340,
|
|
72
79
|
hotspots: [],
|
|
73
80
|
},
|
|
74
|
-
}
|
|
81
|
+
}, {
|
|
82
|
+
prRiskScore: 30,
|
|
83
|
+
repositoryHealthScore: 63,
|
|
84
|
+
layerScores: typescriptLayerScores,
|
|
85
|
+
});
|
|
75
86
|
export const scanResultLimitedContext = {
|
|
76
87
|
totalScore: 40,
|
|
77
88
|
layerScores: {
|
|
@@ -5,7 +5,8 @@ export type BuildScanCardPresentationInput = {
|
|
|
5
5
|
pipelineStatus: PipelineStatus;
|
|
6
6
|
result: ScanResult | null;
|
|
7
7
|
decision?: string | null;
|
|
8
|
-
|
|
8
|
+
/** Denormalized PR risk score (preferred). */
|
|
9
|
+
prRiskScore?: number | null;
|
|
9
10
|
};
|
|
10
11
|
export declare function buildScanCardPresentation(input: BuildScanCardPresentationInput): DashboardCardPresentation;
|
|
11
12
|
//# sourceMappingURL=buildScanCardPresentation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildScanCardPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanCardPresentation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAUjD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAErF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,
|
|
1
|
+
{"version":3,"file":"buildScanCardPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanCardPresentation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAUjD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAErF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAiCF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,8BAA8B,GACpC,yBAAyB,CA0B3B"}
|
|
@@ -2,14 +2,16 @@ import { assessmentLimitedContext } from "../../fixtures/assessmentFixtures.js";
|
|
|
2
2
|
import { mergePostureFromDecision, } from "../../riskVocabulary.js";
|
|
3
3
|
import { buildScanPresentationBundle } from "./buildScanPresentationBundle.js";
|
|
4
4
|
import { presentDashboardCard, presentPipelineDashboardCard, } from "../presenters/presentDashboardCard.js";
|
|
5
|
-
function minimalResultFromDenormalized(decision,
|
|
5
|
+
function minimalResultFromDenormalized(decision, prRiskScore) {
|
|
6
6
|
const posture = mergePostureFromDecision(decision ?? undefined);
|
|
7
|
-
if (!posture && (
|
|
7
|
+
if (!posture && (prRiskScore == null || !Number.isFinite(prRiskScore))) {
|
|
8
8
|
return null;
|
|
9
9
|
}
|
|
10
|
+
const score = prRiskScore ?? 0;
|
|
10
11
|
const resolvedPosture = posture;
|
|
11
12
|
return {
|
|
12
|
-
totalScore:
|
|
13
|
+
totalScore: score,
|
|
14
|
+
prRisk: { score },
|
|
13
15
|
layerScores: {
|
|
14
16
|
security: 0,
|
|
15
17
|
maintainability: 0,
|
|
@@ -30,8 +32,8 @@ export function buildScanCardPresentation(input) {
|
|
|
30
32
|
if (input.pipelineStatus !== "done") {
|
|
31
33
|
return presentPipelineDashboardCard(input.pipelineStatus === "failed" ? "failed" : input.pipelineStatus);
|
|
32
34
|
}
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
+
const prRiskScore = input.prRiskScore ?? null;
|
|
36
|
+
const result = input.result ?? minimalResultFromDenormalized(input.decision, prRiskScore);
|
|
35
37
|
if (!result) {
|
|
36
38
|
return presentPipelineDashboardCard("failed");
|
|
37
39
|
}
|
|
@@ -39,7 +41,6 @@ export function buildScanCardPresentation(input) {
|
|
|
39
41
|
result,
|
|
40
42
|
pipelineStatus: input.pipelineStatus,
|
|
41
43
|
decision: input.decision,
|
|
42
|
-
totalScore: input.totalScore,
|
|
43
44
|
});
|
|
44
45
|
if (!bundle) {
|
|
45
46
|
return presentPipelineDashboardCard("failed");
|
|
@@ -8,7 +8,7 @@ export type BuildScanDetailsPresentationInput = {
|
|
|
8
8
|
methodologyVersion?: string | null;
|
|
9
9
|
prNumber?: number | null;
|
|
10
10
|
decision?: string | null;
|
|
11
|
-
|
|
11
|
+
prRiskScore?: number | null;
|
|
12
12
|
};
|
|
13
13
|
export declare function buildScanDetailsPresentation(input: BuildScanDetailsPresentationInput): ScanDetailsPresentation | null;
|
|
14
14
|
//# sourceMappingURL=buildScanDetailsPresentation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildScanDetailsPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanDetailsPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAEjF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,UAAU,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,
|
|
1
|
+
{"version":3,"file":"buildScanDetailsPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanDetailsPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAEjF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,UAAU,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,iCAAiC,GACvC,uBAAuB,GAAG,IAAI,CAgBhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildScanPresentationBundle.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanPresentationBundle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E,MAAM,MAAM,gCAAgC,GAAG;IAC7C,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"buildScanPresentationBundle.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanPresentationBundle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E,MAAM,MAAM,gCAAgC,GAAG;IAC7C,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,gCAAgC,GACtC,sBAAsB,GAAG,IAAI,CA4B/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentCliScanSummary.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentCliScanSummary.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"presentCliScanSummary.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentCliScanSummary.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,mBAAmB,CAiCrB"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import { scoreToBandLabel } from "../../prRiskBand.js";
|
|
2
|
+
import { resolvePrRiskLayerScores } from "../../prRiskWire.js";
|
|
1
3
|
import { buildNarrativeChannels, composeHeadline, composeSubheadline, composeSupportingContext, composeVerificationActions, evidenceContextFromProfile, projectCompactKeyPoints, } from "../compose/narrativeCompose.js";
|
|
2
4
|
import { projectAssessmentFields } from "../projectAssessmentFields.js";
|
|
3
5
|
export function presentCliScanSummary(bundle, ctx = {}) {
|
|
4
6
|
const { facts, profile, result } = bundle;
|
|
5
|
-
const
|
|
6
|
-
const layerLine =
|
|
7
|
-
? `security=${
|
|
7
|
+
const layerScores = resolvePrRiskLayerScores(result);
|
|
8
|
+
const layerLine = layerScores
|
|
9
|
+
? `security=${layerScores.security} maintainability=${layerScores.maintainability} ecosystem=${layerScores.ecosystem} upgradeImpact=${layerScores.upgradeImpact}`
|
|
8
10
|
: "";
|
|
11
|
+
const prRiskScore = facts.riskSignals?.riskIndex ?? facts.riskIndex ?? 0;
|
|
9
12
|
return {
|
|
10
13
|
...projectAssessmentFields(bundle),
|
|
11
14
|
header: {
|
|
@@ -22,7 +25,9 @@ export function presentCliScanSummary(bundle, ctx = {}) {
|
|
|
22
25
|
keyPoints: projectCompactKeyPoints(buildNarrativeChannels(bundle), 6),
|
|
23
26
|
verificationActions: composeVerificationActions(bundle, 5),
|
|
24
27
|
metrics: {
|
|
25
|
-
|
|
28
|
+
prRiskScore,
|
|
29
|
+
prRiskBandLabel: scoreToBandLabel(prRiskScore) ?? undefined,
|
|
30
|
+
riskIndex: prRiskScore,
|
|
26
31
|
layerLine,
|
|
27
32
|
findingCount: result.findings?.length ?? 0,
|
|
28
33
|
recommendationCount: result.recommendations?.length ?? 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentDashboardCard.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentDashboardCard.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAErF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAoEzF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,sBAAsB,GAC7B,yBAAyB,
|
|
1
|
+
{"version":3,"file":"presentDashboardCard.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentDashboardCard.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAErF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAoEzF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,sBAAsB,GAC7B,yBAAyB,CA+C3B;AAED,wBAAgB,sCAAsC,IAAI,yBAAyB,CAelF;AAED,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAC9C,yBAAyB,CAqB3B"}
|
|
@@ -59,8 +59,9 @@ export function presentDashboardCard(bundle) {
|
|
|
59
59
|
const { facts, profile } = bundle;
|
|
60
60
|
const channels = buildNarrativeChannels(bundle);
|
|
61
61
|
const posture = profile.status;
|
|
62
|
-
const riskIndex = facts.riskIndex != null &&
|
|
63
|
-
|
|
62
|
+
const riskIndex = facts.riskSignals?.riskIndex != null &&
|
|
63
|
+
Number.isFinite(facts.riskSignals.riskIndex)
|
|
64
|
+
? facts.riskSignals.riskIndex
|
|
64
65
|
: -1;
|
|
65
66
|
const insights = channels.insights.slice(0, INSIGHTS_CAP);
|
|
66
67
|
const scopeAreas = channels.scopeAreas.length > 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentGitHubCheckRun.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentGitHubCheckRun.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"presentGitHubCheckRun.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentGitHubCheckRun.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAChE,0BAA0B,CA4C5B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { scoreToBandLabel } from "../../prRiskBand.js";
|
|
1
2
|
import { buildNarrativeChannels, composeHeadline, composeSubheadline, composeVerificationActions, evidenceContextFromProfile, projectCompactKeyPoints, } from "../compose/narrativeCompose.js";
|
|
2
3
|
import { projectAssessmentFields } from "../projectAssessmentFields.js";
|
|
3
4
|
export function presentGitHubCheckRun(bundle, ctx) {
|
|
@@ -12,6 +13,15 @@ export function presentGitHubCheckRun(bundle, ctx) {
|
|
|
12
13
|
? "failure"
|
|
13
14
|
: "neutral";
|
|
14
15
|
const sections = [];
|
|
16
|
+
const prRiskScore = bundle.facts.riskSignals?.riskIndex;
|
|
17
|
+
const prRiskBandLabelText = scoreToBandLabel(prRiskScore);
|
|
18
|
+
if (prRiskScore != null && prRiskBandLabelText) {
|
|
19
|
+
sections.push({
|
|
20
|
+
id: "why",
|
|
21
|
+
title: "PR Risk",
|
|
22
|
+
bullets: [`${prRiskScore} (${prRiskBandLabelText})`],
|
|
23
|
+
});
|
|
24
|
+
}
|
|
15
25
|
if (keyPoints.length > 0) {
|
|
16
26
|
sections.push({ id: "why", title: "Why", bullets: keyPoints });
|
|
17
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentGitHubPrComment.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentGitHubPrComment.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"presentGitHubPrComment.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentGitHubPrComment.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,sBAAsB,GAC7B,2BAA2B,CAmC7B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MERGE_POSTURE_LABEL } from "../../riskVocabulary.js";
|
|
2
|
+
import { scoreToBandLabel } from "../../prRiskBand.js";
|
|
2
3
|
import { buildNarrativeChannels, evidenceContextFromProfile, } from "../compose/narrativeCompose.js";
|
|
3
4
|
import { formatChangedPackagesShort } from "../../narrativePresentation.js";
|
|
4
5
|
import { projectAssessmentFields } from "../projectAssessmentFields.js";
|
|
@@ -10,6 +11,11 @@ export function presentGitHubPrComment(bundle) {
|
|
|
10
11
|
const changed = formatChangedPackagesShort(facts, 3);
|
|
11
12
|
if (changed)
|
|
12
13
|
introLines.push(`Changed: ${changed}`);
|
|
14
|
+
const prRiskScore = bundle.facts.riskSignals?.riskIndex;
|
|
15
|
+
const prRiskBandLabelText = scoreToBandLabel(prRiskScore);
|
|
16
|
+
if (prRiskScore != null && prRiskBandLabelText) {
|
|
17
|
+
introLines.push(`PR Risk: ${prRiskScore} (${prRiskBandLabelText})`);
|
|
18
|
+
}
|
|
13
19
|
for (const line of assessmentFields.reasoning.slice(0, 2)) {
|
|
14
20
|
introLines.push(line);
|
|
15
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentScanDetails.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentScanDetails.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"presentScanDetails.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentScanDetails.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AA6FF,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,EAAE,yBAAyB,GAC7B,uBAAuB,CAiFzB"}
|
|
@@ -1,10 +1,46 @@
|
|
|
1
1
|
import { MERGE_CONCERN_LABELS } from "../../assessmentLabels.js";
|
|
2
2
|
import { normalizedPackageUsagePaths } from "../../narrativePresentation.js";
|
|
3
|
+
import { prRiskBandLabel, prRiskBandToGaugeBand, scoreToBandLabel, } from "../../prRiskBand.js";
|
|
3
4
|
import { MERGE_POSTURE_LABEL } from "../../riskVocabulary.js";
|
|
4
5
|
import { buildNarrativeChannels, composeSubheadline, composeSupportingContext, evidenceContextFromProfile, projectCompactKeyPoints, } from "../compose/narrativeCompose.js";
|
|
5
6
|
import { normalizeGeneratedText, normalizeGeneratedTextNullable, } from "../../normalizeGeneratedText.js";
|
|
6
7
|
import { scanSurfaceCopy } from "../../scanSurfaceCopy.js";
|
|
7
8
|
import { projectAssessmentFields } from "../projectAssessmentFields.js";
|
|
9
|
+
const LAYER_LABEL = {
|
|
10
|
+
security: "Security",
|
|
11
|
+
maintainability: "Maintainability",
|
|
12
|
+
ecosystem: "Ecosystem",
|
|
13
|
+
upgradeImpact: "Upgrade impact",
|
|
14
|
+
};
|
|
15
|
+
function gaugeBandToSignalBand(band) {
|
|
16
|
+
if (band === "high")
|
|
17
|
+
return "high";
|
|
18
|
+
if (band === "moderate")
|
|
19
|
+
return "medium";
|
|
20
|
+
return "low";
|
|
21
|
+
}
|
|
22
|
+
function mapSignalSummary(bundle) {
|
|
23
|
+
const riskSignals = bundle.facts.riskSignals;
|
|
24
|
+
const prRiskScore = riskSignals?.riskIndex;
|
|
25
|
+
if (!riskSignals || prRiskScore == null || !Number.isFinite(prRiskScore)) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const band = riskSignals.band;
|
|
29
|
+
if (!band)
|
|
30
|
+
return undefined;
|
|
31
|
+
const gaugeBand = prRiskBandToGaugeBand(band);
|
|
32
|
+
const signalBand = gaugeBandToSignalBand(gaugeBand);
|
|
33
|
+
return {
|
|
34
|
+
prRiskScore,
|
|
35
|
+
band: signalBand,
|
|
36
|
+
layers: riskSignals.layers.map((layer) => ({
|
|
37
|
+
layer: layer.layer,
|
|
38
|
+
score: layer.score,
|
|
39
|
+
band: gaugeBandToSignalBand(prRiskBandToGaugeBand(layer.band)),
|
|
40
|
+
label: LAYER_LABEL[layer.layer],
|
|
41
|
+
})),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
8
44
|
function mapUsage(bundle) {
|
|
9
45
|
const { facts } = bundle;
|
|
10
46
|
if (facts.packageUsage.length === 0 && facts.frameworks.length === 0) {
|
|
@@ -43,7 +79,7 @@ function mapEvidence(bundle) {
|
|
|
43
79
|
};
|
|
44
80
|
}
|
|
45
81
|
export function presentScanDetails(bundle, ctx) {
|
|
46
|
-
const { assessment, facts, profile
|
|
82
|
+
const { assessment, facts, profile } = bundle;
|
|
47
83
|
const assessmentFields = projectAssessmentFields(bundle);
|
|
48
84
|
const channels = buildNarrativeChannels(bundle);
|
|
49
85
|
const keyPoints = projectCompactKeyPoints(channels, 6);
|
|
@@ -74,6 +110,10 @@ export function presentScanDetails(bundle, ctx) {
|
|
|
74
110
|
: "low",
|
|
75
111
|
rationale: action.detail,
|
|
76
112
|
}));
|
|
113
|
+
const prRiskScore = facts.riskSignals?.riskIndex ?? null;
|
|
114
|
+
const prRiskBandLabelText = facts.riskSignals?.band != null
|
|
115
|
+
? prRiskBandLabel(facts.riskSignals.band)
|
|
116
|
+
: scoreToBandLabel(prRiskScore);
|
|
77
117
|
return {
|
|
78
118
|
...assessmentFields,
|
|
79
119
|
evidenceContext: evidenceContextFromProfile(bundle),
|
|
@@ -87,8 +127,11 @@ export function presentScanDetails(bundle, ctx) {
|
|
|
87
127
|
verdictLine: normalizeGeneratedText(verdictLine),
|
|
88
128
|
scopeChip: channels.reachLabel,
|
|
89
129
|
postureLabel,
|
|
90
|
-
|
|
130
|
+
prRiskScore,
|
|
131
|
+
prRiskBandLabel: prRiskBandLabelText ?? undefined,
|
|
132
|
+
riskIndex: prRiskScore,
|
|
91
133
|
},
|
|
134
|
+
signalSummary: mapSignalSummary(bundle),
|
|
92
135
|
narrative: {
|
|
93
136
|
keyPoints: keyPoints.map((k) => normalizeGeneratedText(k)),
|
|
94
137
|
changedPackages: facts.changedPackages.all,
|
|
@@ -102,7 +145,7 @@ export function presentScanDetails(bundle, ctx) {
|
|
|
102
145
|
supportingContext,
|
|
103
146
|
metadata: {
|
|
104
147
|
scanId: ctx.scanId,
|
|
105
|
-
generatedAt: result.generatedAt,
|
|
148
|
+
generatedAt: bundle.result.generatedAt,
|
|
106
149
|
methodologyVersion: ctx.methodologyVersion,
|
|
107
150
|
changedPackagesSummary: facts.changedPackages.primary ?? facts.changedPackages.all.join(", "),
|
|
108
151
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderCliScanSummaryText.d.ts","sourceRoot":"","sources":["../../../src/presentation/render/renderCliScanSummaryText.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"renderCliScanSummaryText.d.ts","sourceRoot":"","sources":["../../../src/presentation/render/renderCliScanSummaryText.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAkCvE"}
|
|
@@ -9,7 +9,10 @@ export function renderCliScanSummaryText(p) {
|
|
|
9
9
|
lines.push(p.subheadline);
|
|
10
10
|
lines.push("", `Status: ${p.status} | Density: ${p.density} | Confidence: ${p.confidence}`);
|
|
11
11
|
if (p.metrics) {
|
|
12
|
-
|
|
12
|
+
const bandSuffix = p.metrics.prRiskBandLabel
|
|
13
|
+
? ` (${p.metrics.prRiskBandLabel})`
|
|
14
|
+
: "";
|
|
15
|
+
lines.push(`${scanSurfaceCopy.actions.prRiskScoreLabel}: ${p.metrics.prRiskScore}${bandSuffix}`, p.metrics.layerLine, `Findings: ${p.metrics.findingCount} | Recommendations: ${p.metrics.recommendationCount}`);
|
|
13
16
|
}
|
|
14
17
|
if (p.keyPoints.length > 0) {
|
|
15
18
|
lines.push("", "Key points:");
|
|
@@ -69,8 +69,8 @@ export declare const productMessaging: {
|
|
|
69
69
|
readonly intro: "The repository dashboard is a runtime-aware review surface for open upgrade pull requests: triage by merge recommendation, then read operational context on each card.";
|
|
70
70
|
readonly posture: `Posture indicates the merge recommendation (${string}, ${string}, ${string}).`;
|
|
71
71
|
readonly exposure: "Reach indicates how prominently affected application paths are surfaced for this upgrade.";
|
|
72
|
-
readonly
|
|
73
|
-
readonly
|
|
72
|
+
readonly prRiskBandsLead: "PR Risk bands (supporting context) read as one of:";
|
|
73
|
+
readonly prRiskBands: readonly string[];
|
|
74
74
|
readonly cardBody: "Below the verdict, scanned cards lead with the changed package, affected areas, verification checks, and blast radius when code intelligence is available - focused on this PR, not the whole repository.";
|
|
75
75
|
};
|
|
76
76
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"productMessaging.d.ts","sourceRoot":"","sources":["../src/productMessaging.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmF3B,6FAA6F;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"productMessaging.d.ts","sourceRoot":"","sources":["../src/productMessaging.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmF3B,6FAA6F;;;;;;;;;CAYrF,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,gBAAgB;;;;CAOnB,CAAC;AAEX,iEAAiE;AACjE,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAOnD"}
|
package/dist/productMessaging.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PR_RISK_BAND_LABELS } from "./prRiskBand.js";
|
|
2
2
|
import { MERGE_POSTURE_LABEL } from "./riskVocabulary.js";
|
|
3
3
|
/**
|
|
4
4
|
* Canonical marketing / category copy. Operational scan strings stay in scanSurfaceCopy.
|
|
@@ -84,8 +84,8 @@ export const productMessaging = {
|
|
|
84
84
|
intro: "The repository dashboard is a runtime-aware review surface for open upgrade pull requests: triage by merge recommendation, then read operational context on each card.",
|
|
85
85
|
posture: `Posture indicates the merge recommendation (${MERGE_POSTURE_LABEL.safe}, ${MERGE_POSTURE_LABEL.needs_review}, ${MERGE_POSTURE_LABEL.risky}).`,
|
|
86
86
|
exposure: "Reach indicates how prominently affected application paths are surfaced for this upgrade.",
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
prRiskBandsLead: "PR Risk bands (supporting context) read as one of:",
|
|
88
|
+
prRiskBands: PR_RISK_BAND_LABELS,
|
|
89
89
|
cardBody: "Below the verdict, scanned cards lead with the changed package, affected areas, verification checks, and blast radius when code intelligence is available - focused on this PR, not the whole repository.",
|
|
90
90
|
},
|
|
91
91
|
};
|
|
@@ -60,21 +60,21 @@ describe("productMessaging", () => {
|
|
|
60
60
|
expect(productMessaging.hero.h1).not.toContain("Dependabot");
|
|
61
61
|
expect(productMessaging.hero.lead).not.toContain("Dependabot");
|
|
62
62
|
});
|
|
63
|
-
it("describes dashboard posture and
|
|
63
|
+
it("describes dashboard posture and PR Risk bands without scoring jargon", () => {
|
|
64
64
|
const d = productMessaging.dashboardPrCard;
|
|
65
65
|
const text = [
|
|
66
66
|
d.intro,
|
|
67
67
|
d.posture,
|
|
68
68
|
d.exposure,
|
|
69
|
-
d.
|
|
70
|
-
...d.
|
|
69
|
+
d.prRiskBandsLead,
|
|
70
|
+
...d.prRiskBands,
|
|
71
71
|
d.cardBody,
|
|
72
72
|
].join(" ");
|
|
73
73
|
expect(text).toContain("merge recommendation");
|
|
74
74
|
expect(text).toContain("affected application paths");
|
|
75
75
|
expect(text).not.toMatch(/total score|0-100|formula|weight/i);
|
|
76
|
-
expect(d.
|
|
77
|
-
expect(d.
|
|
76
|
+
expect(d.prRiskBands).toHaveLength(5);
|
|
77
|
+
expect(d.prRiskBands).toContain("Medium");
|
|
78
78
|
});
|
|
79
79
|
});
|
|
80
80
|
function collectMarketingStrings() {
|
|
@@ -92,6 +92,6 @@ function collectMarketingStrings() {
|
|
|
92
92
|
out.push(body);
|
|
93
93
|
}
|
|
94
94
|
const d = productMessaging.dashboardPrCard;
|
|
95
|
-
out.push(d.intro, d.posture, d.exposure, d.
|
|
95
|
+
out.push(d.intro, d.posture, d.exposure, d.prRiskBandsLead, d.cardBody, ...d.prRiskBands);
|
|
96
96
|
return out;
|
|
97
97
|
}
|
|
@@ -2,13 +2,14 @@ export type ScanPipelineStatus = "queued" | "running" | "done" | "failed";
|
|
|
2
2
|
export type PipelineCompletionEvidence = {
|
|
3
3
|
scannedAt?: string | null;
|
|
4
4
|
decision?: string | null;
|
|
5
|
-
|
|
5
|
+
/** Denormalized or resolved PR risk score — completion signal only. */
|
|
6
|
+
prRiskScore?: number | null;
|
|
6
7
|
hasResult?: boolean;
|
|
7
8
|
};
|
|
8
|
-
/** Scan completion signals — decision/
|
|
9
|
+
/** Scan completion signals — decision/prRiskScore/result are set after analysis. */
|
|
9
10
|
export declare function hasScanCompletionEvidence(evidence: PipelineCompletionEvidence): boolean;
|
|
10
11
|
/**
|
|
11
|
-
* Resolve wire status using completion evidence (decision,
|
|
12
|
+
* Resolve wire status using completion evidence (decision, prRiskScore, result).
|
|
12
13
|
* Handles races where denormalized columns are written before status flips to done.
|
|
13
14
|
*/
|
|
14
15
|
export declare function resolvePipelineStatus(status: string | undefined, evidence: PipelineCompletionEvidence): ScanPipelineStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolvePipelineStatus.d.ts","sourceRoot":"","sources":["../src/resolvePipelineStatus.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1E,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,
|
|
1
|
+
{"version":3,"file":"resolvePipelineStatus.d.ts","sourceRoot":"","sources":["../src/resolvePipelineStatus.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1E,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAsBF,oFAAoF;AACpF,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,0BAA0B,GACnC,OAAO,CAQT;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,0BAA0B,GACnC,kBAAkB,CAKpB"}
|
|
@@ -10,13 +10,13 @@ function normalizePipelineStatus(status) {
|
|
|
10
10
|
function isMergePostureDecision(decision) {
|
|
11
11
|
return (decision === "safe" || decision === "needs_review" || decision === "risky");
|
|
12
12
|
}
|
|
13
|
-
/** Scan completion signals — decision/
|
|
13
|
+
/** Scan completion signals — decision/prRiskScore/result are set after analysis. */
|
|
14
14
|
export function hasScanCompletionEvidence(evidence) {
|
|
15
15
|
if (isMergePostureDecision(evidence.decision))
|
|
16
16
|
return true;
|
|
17
17
|
if (evidence.hasResult === true)
|
|
18
18
|
return true;
|
|
19
|
-
if (evidence.
|
|
19
|
+
if (evidence.prRiskScore != null && Number.isFinite(evidence.prRiskScore)) {
|
|
20
20
|
return true;
|
|
21
21
|
}
|
|
22
22
|
if (evidence.scannedAt?.trim())
|
|
@@ -24,7 +24,7 @@ export function hasScanCompletionEvidence(evidence) {
|
|
|
24
24
|
return false;
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
|
-
* Resolve wire status using completion evidence (decision,
|
|
27
|
+
* Resolve wire status using completion evidence (decision, prRiskScore, result).
|
|
28
28
|
* Handles races where denormalized columns are written before status flips to done.
|
|
29
29
|
*/
|
|
30
30
|
export function resolvePipelineStatus(status, evidence) {
|