@mergesignal/shared 0.4.2 → 0.5.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 +1 -22
- package/dist/actionsStepSummary.d.ts.map +1 -1
- package/dist/actionsStepSummary.js +19 -716
- package/dist/actionsStepSummary.test.js +34 -329
- package/dist/assessmentLabels.d.ts +6 -0
- package/dist/assessmentLabels.d.ts.map +1 -0
- package/dist/assessmentLabels.js +33 -0
- package/dist/assessmentProjection.d.ts +12 -0
- package/dist/assessmentProjection.d.ts.map +1 -0
- package/dist/assessmentProjection.js +100 -0
- package/dist/assessmentSchema.d.ts +155 -0
- package/dist/assessmentSchema.d.ts.map +1 -0
- package/dist/assessmentSchema.js +110 -0
- package/dist/cardObservationCatalog.d.ts +2 -0
- package/dist/cardObservationCatalog.d.ts.map +1 -1
- package/dist/cardObservationCatalog.js +47 -1
- package/dist/engineWireRegression.test.js +24 -4
- package/dist/fixtures/assessmentFixtures.d.ts +13 -0
- package/dist/fixtures/assessmentFixtures.d.ts.map +1 -0
- package/dist/fixtures/assessmentFixtures.js +164 -0
- package/dist/formatCardExposureDisplay.d.ts +0 -4
- package/dist/formatCardExposureDisplay.d.ts.map +1 -1
- package/dist/formatCardExposureDisplay.js +0 -15
- package/dist/formatInsight.d.ts +3 -2
- package/dist/formatInsight.d.ts.map +1 -1
- package/dist/formatInsight.js +26 -1
- package/dist/index.d.ts +7 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -11
- package/dist/narrativeParity.test.js +6 -37
- package/dist/presentGitHubPrComment.d.ts +1 -3
- package/dist/presentGitHubPrComment.d.ts.map +1 -1
- package/dist/presentGitHubPrComment.js +0 -17
- package/dist/presentation/compose/narrativeChannels.d.ts +17 -0
- package/dist/presentation/compose/narrativeChannels.d.ts.map +1 -0
- package/dist/presentation/compose/narrativeChannels.js +45 -0
- package/dist/presentation/compose/narrativeChannels.test.d.ts +2 -0
- package/dist/presentation/compose/narrativeChannels.test.d.ts.map +1 -0
- package/dist/presentation/compose/narrativeChannels.test.js +42 -0
- package/dist/presentation/compose/narrativeCompose.d.ts +1 -0
- package/dist/presentation/compose/narrativeCompose.d.ts.map +1 -1
- package/dist/presentation/compose/narrativeCompose.js +5 -7
- package/dist/presentation/dto/assessmentPresentationFields.d.ts +13 -0
- package/dist/presentation/dto/assessmentPresentationFields.d.ts.map +1 -0
- package/dist/presentation/dto/dashboardCardPresentation.d.ts +30 -0
- package/dist/presentation/dto/dashboardCardPresentation.d.ts.map +1 -0
- package/dist/presentation/dto/dashboardCardPresentation.js +1 -0
- package/dist/presentation/dto/githubAndCliPresentation.d.ts +4 -3
- package/dist/presentation/dto/githubAndCliPresentation.d.ts.map +1 -1
- package/dist/presentation/dto/scanDetailsPresentation.d.ts +2 -1
- package/dist/presentation/dto/scanDetailsPresentation.d.ts.map +1 -1
- package/dist/presentation/dto/types.d.ts +0 -9
- package/dist/presentation/dto/types.d.ts.map +1 -1
- package/dist/presentation/dto/types.js +1 -22
- package/dist/presentation/fixtures/dashboardCardGolden.test.d.ts +2 -0
- package/dist/presentation/fixtures/dashboardCardGolden.test.d.ts.map +1 -0
- package/dist/presentation/fixtures/dashboardCardGolden.test.js +38 -0
- package/dist/presentation/fixtures/presentationPersonaFixtures.d.ts.map +1 -1
- package/dist/presentation/fixtures/presentationPersonaFixtures.js +31 -24
- package/dist/presentation/fixtures/scanResultFixtures.d.ts.map +1 -1
- package/dist/presentation/fixtures/scanResultFixtures.js +14 -3
- package/dist/presentation/index.d.ts +6 -6
- package/dist/presentation/index.d.ts.map +1 -1
- package/dist/presentation/index.js +2 -4
- package/dist/presentation/orchestration/buildScanCardPresentation.d.ts +2 -2
- package/dist/presentation/orchestration/buildScanCardPresentation.d.ts.map +1 -1
- package/dist/presentation/orchestration/buildScanCardPresentation.js +13 -9
- package/dist/presentation/orchestration/buildScanPresentationBundle.d.ts +1 -1
- package/dist/presentation/orchestration/buildScanPresentationBundle.d.ts.map +1 -1
- package/dist/presentation/orchestration/buildScanPresentationBundle.js +12 -10
- package/dist/presentation/orchestration/scanPresentationBundle.d.ts +8 -3
- package/dist/presentation/orchestration/scanPresentationBundle.d.ts.map +1 -1
- package/dist/presentation/presentation.test.js +16 -18
- package/dist/presentation/presentationPersonas.test.js +20 -19
- package/dist/presentation/presenters/presentCliScanSummary.d.ts.map +1 -1
- package/dist/presentation/presenters/presentCliScanSummary.js +4 -2
- package/dist/presentation/presenters/presentDashboardCard.d.ts +5 -0
- package/dist/presentation/presenters/presentDashboardCard.d.ts.map +1 -0
- package/dist/presentation/presenters/presentDashboardCard.js +119 -0
- package/dist/presentation/presenters/presentGitHubCheckRun.d.ts.map +1 -1
- package/dist/presentation/presenters/presentGitHubCheckRun.js +4 -2
- package/dist/presentation/presenters/presentGitHubPrComment.d.ts.map +1 -1
- package/dist/presentation/presenters/presentGitHubPrComment.js +15 -21
- package/dist/presentation/presenters/presentScanDetails.d.ts.map +1 -1
- package/dist/presentation/presenters/presentScanDetails.js +53 -127
- package/dist/presentation/profile/buildProfileFromAssessment.d.ts +5 -0
- package/dist/presentation/profile/buildProfileFromAssessment.d.ts.map +1 -0
- package/dist/presentation/profile/buildProfileFromAssessment.js +58 -0
- package/dist/presentation/projectAssessmentFields.d.ts +4 -0
- package/dist/presentation/projectAssessmentFields.d.ts.map +1 -0
- package/dist/presentation/projectAssessmentFields.js +13 -0
- package/dist/presentation/surfaceParity.test.d.ts +2 -0
- package/dist/presentation/surfaceParity.test.d.ts.map +1 -0
- package/dist/presentation/surfaceParity.test.js +74 -0
- package/dist/productMessaging.d.ts +4 -4
- package/dist/productMessaging.d.ts.map +1 -1
- package/dist/productMessaging.js +4 -4
- package/dist/productMessaging.test.js +2 -2
- package/dist/repoIntelligenceSchema.d.ts +2 -2
- package/dist/resolvePipelineStatus.d.ts +15 -0
- package/dist/resolvePipelineStatus.d.ts.map +1 -0
- package/dist/resolvePipelineStatus.js +37 -0
- package/dist/scanCardPresentationState.d.ts +4 -0
- package/dist/scanCardPresentationState.d.ts.map +1 -0
- package/dist/scanCardPresentationState.js +4 -0
- package/dist/{scanDetailViewModel.d.ts → scanDetailViewModelTypes.d.ts} +60 -32
- package/dist/scanDetailViewModelTypes.d.ts.map +1 -0
- package/dist/scanDetailViewModelTypes.js +4 -0
- package/dist/scanResultSchema.d.ts +75 -2
- package/dist/scanResultSchema.d.ts.map +1 -1
- package/dist/scanResultSchema.js +4 -2
- package/dist/scanResultSchema.test.js +16 -0
- package/dist/trustedScanGuards.test.js +7 -0
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/collectNarrativeWhyBullets.d.ts +0 -12
- package/dist/collectNarrativeWhyBullets.d.ts.map +0 -1
- package/dist/collectNarrativeWhyBullets.js +0 -104
- package/dist/deriveCardDisplaySummary.d.ts +0 -16
- package/dist/deriveCardDisplaySummary.d.ts.map +0 -1
- package/dist/deriveCardDisplaySummary.js +0 -56
- package/dist/deriveCardDisplaySummary.test.d.ts +0 -2
- package/dist/deriveCardDisplaySummary.test.d.ts.map +0 -1
- package/dist/deriveCardDisplaySummary.test.js +0 -89
- package/dist/deriveCardOperationalObservations.d.ts +0 -19
- package/dist/deriveCardOperationalObservations.d.ts.map +0 -1
- package/dist/deriveCardOperationalObservations.js +0 -180
- package/dist/deriveCardOperationalObservations.test.d.ts +0 -2
- package/dist/deriveCardOperationalObservations.test.d.ts.map +0 -1
- package/dist/deriveCardOperationalObservations.test.js +0 -268
- package/dist/deriveRiskScoreSummary.d.ts +0 -33
- package/dist/deriveRiskScoreSummary.d.ts.map +0 -1
- package/dist/deriveRiskScoreSummary.js +0 -90
- package/dist/deriveRiskScoreSummary.test.d.ts +0 -2
- package/dist/deriveRiskScoreSummary.test.d.ts.map +0 -1
- package/dist/deriveRiskScoreSummary.test.js +0 -47
- package/dist/deriveScanDetailRecommendations.d.ts +0 -63
- package/dist/deriveScanDetailRecommendations.d.ts.map +0 -1
- package/dist/deriveScanDetailRecommendations.js +0 -725
- package/dist/deriveScanDetailRecommendations.test.d.ts +0 -2
- package/dist/deriveScanDetailRecommendations.test.d.ts.map +0 -1
- package/dist/deriveScanDetailRecommendations.test.js +0 -181
- package/dist/deriveScanSummaryText.d.ts +0 -7
- package/dist/deriveScanSummaryText.d.ts.map +0 -1
- package/dist/deriveScanSummaryText.js +0 -24
- package/dist/deriveScanSummaryText.test.d.ts +0 -2
- package/dist/deriveScanSummaryText.test.d.ts.map +0 -1
- package/dist/deriveScanSummaryText.test.js +0 -77
- package/dist/formatCardEvidenceCounts.d.ts +0 -7
- package/dist/formatCardEvidenceCounts.d.ts.map +0 -1
- package/dist/formatCardEvidenceCounts.js +0 -19
- package/dist/prCheckRunPresentation.d.ts +0 -68
- package/dist/prCheckRunPresentation.d.ts.map +0 -1
- package/dist/prCheckRunPresentation.js +0 -319
- package/dist/prCheckRunPresentation.test.d.ts +0 -2
- package/dist/prCheckRunPresentation.test.d.ts.map +0 -1
- package/dist/prCheckRunPresentation.test.js +0 -278
- package/dist/presentation/dto/scanCardPresentation.d.ts +0 -27
- package/dist/presentation/dto/scanCardPresentation.d.ts.map +0 -1
- package/dist/presentation/intent/derivePresentationInterpretation.d.ts +0 -4
- package/dist/presentation/intent/derivePresentationInterpretation.d.ts.map +0 -1
- package/dist/presentation/intent/derivePresentationInterpretation.js +0 -202
- package/dist/presentation/intent/formatPresentationCopy.d.ts +0 -7
- package/dist/presentation/intent/formatPresentationCopy.d.ts.map +0 -1
- package/dist/presentation/intent/formatPresentationCopy.js +0 -153
- package/dist/presentation/intent/presentationIntent.test.d.ts +0 -2
- package/dist/presentation/intent/presentationIntent.test.d.ts.map +0 -1
- package/dist/presentation/intent/presentationIntent.test.js +0 -29
- package/dist/presentation/intent/verificationFocusLabels.d.ts +0 -2
- package/dist/presentation/intent/verificationFocusLabels.d.ts.map +0 -1
- package/dist/presentation/intent/verificationFocusLabels.js +0 -45
- package/dist/presentation/presenters/presentPipelineScanCard.d.ts +0 -3
- package/dist/presentation/presenters/presentPipelineScanCard.d.ts.map +0 -1
- package/dist/presentation/presenters/presentPipelineScanCard.js +0 -23
- package/dist/presentation/presenters/presentScanCard.d.ts +0 -7
- package/dist/presentation/presenters/presentScanCard.d.ts.map +0 -1
- package/dist/presentation/presenters/presentScanCard.js +0 -44
- package/dist/presentation/profile/derivePresentationProfile.d.ts +0 -12
- package/dist/presentation/profile/derivePresentationProfile.d.ts.map +0 -1
- package/dist/presentation/profile/derivePresentationProfile.js +0 -85
- package/dist/scanCardSummary.d.ts +0 -59
- package/dist/scanCardSummary.d.ts.map +0 -1
- package/dist/scanCardSummary.js +0 -146
- package/dist/scanCardSummary.test.d.ts +0 -2
- package/dist/scanCardSummary.test.d.ts.map +0 -1
- package/dist/scanCardSummary.test.js +0 -234
- package/dist/scanDetailViewModel.d.ts.map +0 -1
- package/dist/scanDetailViewModel.js +0 -636
- package/dist/scanDetailViewModel.test.d.ts +0 -2
- package/dist/scanDetailViewModel.test.d.ts.map +0 -1
- package/dist/scanDetailViewModel.test.js +0 -530
- /package/dist/presentation/dto/{scanCardPresentation.js → assessmentPresentationFields.js} +0 -0
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import type { ScanCardPresentation } from "./presentation/dto/scanCardPresentation.js";
|
|
2
|
-
import type { Finding, ScanResult } from "./types.js";
|
|
3
|
-
export type ScanPipelineStatus = "queued" | "running" | "done" | "failed";
|
|
4
|
-
export type ScanCardPresentationState = "not_scanned" | "scanning" | "analysis_failed" | "ready" | "stale";
|
|
5
|
-
export type RiskIndexBand = "low" | "medium" | "high";
|
|
6
|
-
export type FindingCountSummary = {
|
|
7
|
-
critical: number;
|
|
8
|
-
high: number;
|
|
9
|
-
medium: number;
|
|
10
|
-
low: number;
|
|
11
|
-
};
|
|
12
|
-
/** @deprecated Use ScanCardPresentation */
|
|
13
|
-
export type ScanCardSummary = ScanCardPresentation;
|
|
14
|
-
export { ScanCardPresentation };
|
|
15
|
-
export declare const SCAN_CARD_SCANNING_SUMMARY = "Waiting for results...";
|
|
16
|
-
export type PipelineCompletionEvidence = {
|
|
17
|
-
scannedAt?: string | null;
|
|
18
|
-
decision?: string | null;
|
|
19
|
-
totalScore?: number | null;
|
|
20
|
-
hasResult?: boolean;
|
|
21
|
-
};
|
|
22
|
-
/** Scan completion signals — decision/totalScore/result are only set after analysis. */
|
|
23
|
-
export declare function hasScanCompletionEvidence(evidence: PipelineCompletionEvidence): boolean;
|
|
24
|
-
/**
|
|
25
|
-
* Resolve wire status using completion evidence (decision, totalScore, result).
|
|
26
|
-
* Handles races where denormalized columns are written before status flips to done.
|
|
27
|
-
*/
|
|
28
|
-
export declare function resolvePipelineStatus(status: string | undefined, evidence: PipelineCompletionEvidence): ScanPipelineStatus;
|
|
29
|
-
/** Pipeline lifecycle copy that must never appear on completed scan cards. */
|
|
30
|
-
export declare function isPipelinePlaceholderCopy(text: string | null | undefined): boolean;
|
|
31
|
-
/** True when summary reflects pipeline lifecycle, not merge posture. */
|
|
32
|
-
export declare function isPipelineCardSummary(summary: ScanCardSummary): boolean;
|
|
33
|
-
/** Single source for risk index color bands (aligns with decision score bands). */
|
|
34
|
-
export declare function deriveRiskIndexBand(score: number | null | undefined): RiskIndexBand | null;
|
|
35
|
-
export declare function aggregateFindingCounts(findings: Finding[] | null | undefined): FindingCountSummary;
|
|
36
|
-
/**
|
|
37
|
-
* Server-side card summary for PR dashboard list views.
|
|
38
|
-
* Pipeline lifecycle copy is included when `pipelineStatus !== "done"`.
|
|
39
|
-
*
|
|
40
|
-
* Quiet safe cards with no mappable signals show posture + exposure only.
|
|
41
|
-
*/
|
|
42
|
-
export declare function deriveScanCardSummary(result: ScanResult | null | undefined, pipelineStatus: ScanPipelineStatus): ScanCardSummary;
|
|
43
|
-
/** Subline appended when scan results are stale (head SHA mismatch). */
|
|
44
|
-
export declare function staleScanSubline(): string;
|
|
45
|
-
/** Rebuild card summary from denormalized scan columns when result JSON is unavailable. */
|
|
46
|
-
export declare function deriveScanCardSummaryFromDenormalized(decision: string | null, totalScore: number | null, summaryText: string | null, pipelineStatus: ScanPipelineStatus): ScanCardSummary;
|
|
47
|
-
export type PrScanCardSummaryInput = {
|
|
48
|
-
pipelineStatus: string;
|
|
49
|
-
decision: string | null;
|
|
50
|
-
totalScore: number | null;
|
|
51
|
-
summaryText: string | null;
|
|
52
|
-
result: ScanResult | null;
|
|
53
|
-
scannedAt?: string | null;
|
|
54
|
-
};
|
|
55
|
-
/**
|
|
56
|
-
* Canonical card summary for PR list/dashboard — single derivation path for API + web.
|
|
57
|
-
*/
|
|
58
|
-
export declare function resolvePrScanCardSummary(input: PrScanCardSummaryInput): ScanCardSummary;
|
|
59
|
-
//# sourceMappingURL=scanCardSummary.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanCardSummary.d.ts","sourceRoot":"","sources":["../src/scanCardSummary.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAMvF,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,2CAA2C;AAC3C,MAAM,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAGhC,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AAEnE,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAsBF,wFAAwF;AACxF,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;AAED,8EAA8E;AAC9E,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,OAAO,CAST;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEvE;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,aAAa,GAAG,IAAI,CAKtB;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,GACrC,mBAAmB,CAgBrB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,EACrC,cAAc,EAAE,kBAAkB,GACjC,eAAe,CAOjB;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,2FAA2F;AAC3F,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,cAAc,EAAE,kBAAkB,GACjC,eAAe,CAuBjB;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,sBAAsB,GAC5B,eAAe,CAcjB"}
|
package/dist/scanCardSummary.js
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { buildScanCardPresentation } from "./presentation/orchestration/buildScanCardPresentation.js";
|
|
2
|
-
import { mergePostureFromDecision, } from "./riskVocabulary.js";
|
|
3
|
-
import { scanSurfaceCopy } from "./scanSurfaceCopy.js";
|
|
4
|
-
const STALE_SUBLINE = "Based on earlier commit";
|
|
5
|
-
export const SCAN_CARD_SCANNING_SUMMARY = "Waiting for results...";
|
|
6
|
-
function normalizePipelineStatus(status) {
|
|
7
|
-
const st = String(status ?? "")
|
|
8
|
-
.trim()
|
|
9
|
-
.toLowerCase();
|
|
10
|
-
if (st === "queued" || st === "running" || st === "done" || st === "failed") {
|
|
11
|
-
return st;
|
|
12
|
-
}
|
|
13
|
-
return "failed";
|
|
14
|
-
}
|
|
15
|
-
function isMergePostureDecision(decision) {
|
|
16
|
-
return (decision === "safe" || decision === "needs_review" || decision === "risky");
|
|
17
|
-
}
|
|
18
|
-
/** Scan completion signals — decision/totalScore/result are only set after analysis. */
|
|
19
|
-
export function hasScanCompletionEvidence(evidence) {
|
|
20
|
-
if (isMergePostureDecision(evidence.decision))
|
|
21
|
-
return true;
|
|
22
|
-
if (evidence.hasResult === true)
|
|
23
|
-
return true;
|
|
24
|
-
if (evidence.totalScore != null && Number.isFinite(evidence.totalScore)) {
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
if (evidence.scannedAt?.trim())
|
|
28
|
-
return true;
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Resolve wire status using completion evidence (decision, totalScore, result).
|
|
33
|
-
* Handles races where denormalized columns are written before status flips to done.
|
|
34
|
-
*/
|
|
35
|
-
export function resolvePipelineStatus(status, evidence) {
|
|
36
|
-
const normalized = normalizePipelineStatus(status);
|
|
37
|
-
if (normalized === "done" || normalized === "failed")
|
|
38
|
-
return normalized;
|
|
39
|
-
if (hasScanCompletionEvidence(evidence))
|
|
40
|
-
return "done";
|
|
41
|
-
return normalized;
|
|
42
|
-
}
|
|
43
|
-
/** Pipeline lifecycle copy that must never appear on completed scan cards. */
|
|
44
|
-
export function isPipelinePlaceholderCopy(text) {
|
|
45
|
-
if (!text?.trim())
|
|
46
|
-
return false;
|
|
47
|
-
const t = text.trim();
|
|
48
|
-
return (t === SCAN_CARD_SCANNING_SUMMARY ||
|
|
49
|
-
t === scanSurfaceCopy.pipeline.scanRunning ||
|
|
50
|
-
t === scanSurfaceCopy.pipeline.scanIncomplete ||
|
|
51
|
-
t === scanSurfaceCopy.pipeline.scanUnavailable);
|
|
52
|
-
}
|
|
53
|
-
/** True when summary reflects pipeline lifecycle, not merge posture. */
|
|
54
|
-
export function isPipelineCardSummary(summary) {
|
|
55
|
-
return summary.pipeline != null;
|
|
56
|
-
}
|
|
57
|
-
/** Single source for risk index color bands (aligns with decision score bands). */
|
|
58
|
-
export function deriveRiskIndexBand(score) {
|
|
59
|
-
if (score == null || !Number.isFinite(score))
|
|
60
|
-
return null;
|
|
61
|
-
if (score > 60)
|
|
62
|
-
return "high";
|
|
63
|
-
if (score > 30)
|
|
64
|
-
return "medium";
|
|
65
|
-
return "low";
|
|
66
|
-
}
|
|
67
|
-
export function aggregateFindingCounts(findings) {
|
|
68
|
-
const counts = {
|
|
69
|
-
critical: 0,
|
|
70
|
-
high: 0,
|
|
71
|
-
medium: 0,
|
|
72
|
-
low: 0,
|
|
73
|
-
};
|
|
74
|
-
if (!Array.isArray(findings))
|
|
75
|
-
return counts;
|
|
76
|
-
for (const f of findings) {
|
|
77
|
-
const s = f.severity;
|
|
78
|
-
if (s === "critical")
|
|
79
|
-
counts.critical += 1;
|
|
80
|
-
else if (s === "high")
|
|
81
|
-
counts.high += 1;
|
|
82
|
-
else if (s === "medium")
|
|
83
|
-
counts.medium += 1;
|
|
84
|
-
else if (s === "low")
|
|
85
|
-
counts.low += 1;
|
|
86
|
-
}
|
|
87
|
-
return counts;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Server-side card summary for PR dashboard list views.
|
|
91
|
-
* Pipeline lifecycle copy is included when `pipelineStatus !== "done"`.
|
|
92
|
-
*
|
|
93
|
-
* Quiet safe cards with no mappable signals show posture + exposure only.
|
|
94
|
-
*/
|
|
95
|
-
export function deriveScanCardSummary(result, pipelineStatus) {
|
|
96
|
-
return buildScanCardPresentation({
|
|
97
|
-
pipelineStatus,
|
|
98
|
-
result: result ?? null,
|
|
99
|
-
decision: result?.decision?.recommendation,
|
|
100
|
-
totalScore: result?.totalScore,
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
/** Subline appended when scan results are stale (head SHA mismatch). */
|
|
104
|
-
export function staleScanSubline() {
|
|
105
|
-
return STALE_SUBLINE;
|
|
106
|
-
}
|
|
107
|
-
/** Rebuild card summary from denormalized scan columns when result JSON is unavailable. */
|
|
108
|
-
export function deriveScanCardSummaryFromDenormalized(decision, totalScore, summaryText, pipelineStatus) {
|
|
109
|
-
if (pipelineStatus !== "done") {
|
|
110
|
-
return deriveScanCardSummary(null, pipelineStatus);
|
|
111
|
-
}
|
|
112
|
-
const posture = mergePostureFromDecision(decision);
|
|
113
|
-
const minimalResult = {
|
|
114
|
-
totalScore: totalScore ?? 0,
|
|
115
|
-
layerScores: {
|
|
116
|
-
security: 0,
|
|
117
|
-
maintainability: 0,
|
|
118
|
-
ecosystem: 0,
|
|
119
|
-
upgradeImpact: 0,
|
|
120
|
-
},
|
|
121
|
-
findings: [],
|
|
122
|
-
generatedAt: new Date().toISOString(),
|
|
123
|
-
decision: posture
|
|
124
|
-
? { recommendation: posture, confidence: "medium", reasoning: [] }
|
|
125
|
-
: undefined,
|
|
126
|
-
};
|
|
127
|
-
const summary = deriveScanCardSummary(minimalResult, "done");
|
|
128
|
-
return summary;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Canonical card summary for PR list/dashboard — single derivation path for API + web.
|
|
132
|
-
*/
|
|
133
|
-
export function resolvePrScanCardSummary(input) {
|
|
134
|
-
const effectivePipeline = resolvePipelineStatus(input.pipelineStatus, {
|
|
135
|
-
decision: input.decision,
|
|
136
|
-
totalScore: input.totalScore,
|
|
137
|
-
hasResult: input.result != null,
|
|
138
|
-
scannedAt: input.scannedAt,
|
|
139
|
-
});
|
|
140
|
-
return buildScanCardPresentation({
|
|
141
|
-
pipelineStatus: effectivePipeline,
|
|
142
|
-
result: input.result,
|
|
143
|
-
decision: input.decision,
|
|
144
|
-
totalScore: input.totalScore,
|
|
145
|
-
});
|
|
146
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanCardSummary.test.d.ts","sourceRoot":"","sources":["../src/scanCardSummary.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { scanSurfaceCopy } from "./scanSurfaceCopy.js";
|
|
3
|
-
import { aggregateFindingCounts, deriveRiskIndexBand, deriveScanCardSummary, deriveScanCardSummaryFromDenormalized, isPipelineCardSummary, isPipelinePlaceholderCopy, resolvePipelineStatus, resolvePrScanCardSummary, staleScanSubline, } from "./scanCardSummary.js";
|
|
4
|
-
const baseResult = {
|
|
5
|
-
totalScore: 10,
|
|
6
|
-
layerScores: {
|
|
7
|
-
security: 1,
|
|
8
|
-
maintainability: 2,
|
|
9
|
-
ecosystem: 3,
|
|
10
|
-
upgradeImpact: 4,
|
|
11
|
-
},
|
|
12
|
-
findings: [],
|
|
13
|
-
generatedAt: "2026-01-01T00:00:00.000Z",
|
|
14
|
-
};
|
|
15
|
-
function pipelineCard(overrides = {}) {
|
|
16
|
-
return {
|
|
17
|
-
pipeline: {
|
|
18
|
-
status: "queued",
|
|
19
|
-
headline: scanSurfaceCopy.pipeline.scanRunning,
|
|
20
|
-
subheadline: scanSurfaceCopy.pipeline.scanIncomplete,
|
|
21
|
-
},
|
|
22
|
-
headline: scanSurfaceCopy.pipeline.scanRunning,
|
|
23
|
-
changedPackages: [],
|
|
24
|
-
keyPoints: [],
|
|
25
|
-
affectedAreas: [],
|
|
26
|
-
verificationActions: [],
|
|
27
|
-
evidence: [],
|
|
28
|
-
...overrides,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
describe("deriveRiskIndexBand", () => {
|
|
32
|
-
it("maps score thresholds", () => {
|
|
33
|
-
expect(deriveRiskIndexBand(0)).toBe("low");
|
|
34
|
-
expect(deriveRiskIndexBand(30)).toBe("low");
|
|
35
|
-
expect(deriveRiskIndexBand(31)).toBe("medium");
|
|
36
|
-
expect(deriveRiskIndexBand(60)).toBe("medium");
|
|
37
|
-
expect(deriveRiskIndexBand(61)).toBe("high");
|
|
38
|
-
expect(deriveRiskIndexBand(null)).toBeNull();
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
describe("aggregateFindingCounts", () => {
|
|
42
|
-
it("counts by severity", () => {
|
|
43
|
-
expect(aggregateFindingCounts([
|
|
44
|
-
{
|
|
45
|
-
id: "1",
|
|
46
|
-
title: "a",
|
|
47
|
-
description: "d",
|
|
48
|
-
severity: "critical",
|
|
49
|
-
packageName: "p",
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
id: "2",
|
|
53
|
-
title: "b",
|
|
54
|
-
description: "d",
|
|
55
|
-
severity: "high",
|
|
56
|
-
packageName: "p",
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
id: "3",
|
|
60
|
-
title: "c",
|
|
61
|
-
description: "d",
|
|
62
|
-
severity: "high",
|
|
63
|
-
packageName: "p",
|
|
64
|
-
},
|
|
65
|
-
])).toEqual({ critical: 1, high: 2, medium: 0, low: 0 });
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
describe("deriveScanCardSummary", () => {
|
|
69
|
-
it("returns scanning copy for queued/running", () => {
|
|
70
|
-
const queued = deriveScanCardSummary(null, "queued");
|
|
71
|
-
expect(queued.headline).toBe(scanSurfaceCopy.pipeline.scanRunning);
|
|
72
|
-
expect(queued.pipeline?.status).toBe("queued");
|
|
73
|
-
expect(queued.status).toBeUndefined();
|
|
74
|
-
const running = deriveScanCardSummary(null, "running");
|
|
75
|
-
expect(running.headline).toBe(scanSurfaceCopy.pipeline.scanRunning);
|
|
76
|
-
expect(running.pipeline?.status).toBe("running");
|
|
77
|
-
});
|
|
78
|
-
it("returns failed copy", () => {
|
|
79
|
-
const failed = deriveScanCardSummary(null, "failed");
|
|
80
|
-
expect(failed.headline).toBe(scanSurfaceCopy.pipeline.analysisIncomplete);
|
|
81
|
-
expect(failed.pipeline?.status).toBe("failed");
|
|
82
|
-
});
|
|
83
|
-
it("derives posture and risk index for done scans", () => {
|
|
84
|
-
const r = {
|
|
85
|
-
...baseResult,
|
|
86
|
-
totalScore: 72,
|
|
87
|
-
decision: {
|
|
88
|
-
recommendation: "risky",
|
|
89
|
-
confidence: "high",
|
|
90
|
-
reasoning: ["Auth boundary change"],
|
|
91
|
-
},
|
|
92
|
-
explain: {
|
|
93
|
-
reasons: [
|
|
94
|
-
{
|
|
95
|
-
id: "upgrade.1",
|
|
96
|
-
layer: "upgradeImpact",
|
|
97
|
-
title: "Large upgrade blast radius",
|
|
98
|
-
scoreImpact: 20,
|
|
99
|
-
},
|
|
100
|
-
],
|
|
101
|
-
},
|
|
102
|
-
};
|
|
103
|
-
const summary = deriveScanCardSummary(r, "done");
|
|
104
|
-
expect(summary.status).toBe("risky");
|
|
105
|
-
expect(summary.headline).toBe(scanSurfaceCopy.presentation.limitedContextHeadline);
|
|
106
|
-
expect(summary.riskIndex).toBe(72);
|
|
107
|
-
});
|
|
108
|
-
it("keeps quiet safe cards minimal without extra key points beyond defaults", () => {
|
|
109
|
-
const r = {
|
|
110
|
-
...baseResult,
|
|
111
|
-
totalScore: 12,
|
|
112
|
-
decision: {
|
|
113
|
-
recommendation: "safe",
|
|
114
|
-
confidence: "high",
|
|
115
|
-
reasoning: [],
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
const summary = deriveScanCardSummary(r, "done");
|
|
119
|
-
expect(summary.status).toBe("safe");
|
|
120
|
-
expect(summary.keyPoints.length).toBeGreaterThan(0);
|
|
121
|
-
});
|
|
122
|
-
it("surfaces catalog key points from explain signals", () => {
|
|
123
|
-
const r = {
|
|
124
|
-
...baseResult,
|
|
125
|
-
decision: {
|
|
126
|
-
recommendation: "needs_review",
|
|
127
|
-
confidence: "medium",
|
|
128
|
-
reasoning: ["Review needed"],
|
|
129
|
-
},
|
|
130
|
-
explain: {
|
|
131
|
-
reasons: [
|
|
132
|
-
{
|
|
133
|
-
id: "1",
|
|
134
|
-
layer: "ecosystem",
|
|
135
|
-
title: "graph.transitive volume",
|
|
136
|
-
scoreImpact: 18,
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
id: "2",
|
|
140
|
-
layer: "ecosystem",
|
|
141
|
-
title: "graph.duplicates",
|
|
142
|
-
scoreImpact: 12,
|
|
143
|
-
},
|
|
144
|
-
{ id: "3", layer: "security", title: "C", scoreImpact: -8 },
|
|
145
|
-
],
|
|
146
|
-
},
|
|
147
|
-
};
|
|
148
|
-
const summary = deriveScanCardSummary(r, "done");
|
|
149
|
-
expect(summary.keyPoints.length).toBeGreaterThan(0);
|
|
150
|
-
});
|
|
151
|
-
it("exports stale subline constant", () => {
|
|
152
|
-
expect(staleScanSubline()).toBe("Based on earlier commit");
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
describe("resolvePipelineStatus", () => {
|
|
156
|
-
it("promotes running to done when completion evidence exists", () => {
|
|
157
|
-
expect(resolvePipelineStatus("running", {
|
|
158
|
-
scannedAt: "2026-01-01T00:00:00.000Z",
|
|
159
|
-
decision: "risky",
|
|
160
|
-
})).toBe("done");
|
|
161
|
-
});
|
|
162
|
-
it("promotes running to done with decision only (no scannedAt)", () => {
|
|
163
|
-
expect(resolvePipelineStatus("running", {
|
|
164
|
-
decision: "risky",
|
|
165
|
-
})).toBe("done");
|
|
166
|
-
});
|
|
167
|
-
it("promotes running to done with totalScore only", () => {
|
|
168
|
-
expect(resolvePipelineStatus("running", { totalScore: 72 })).toBe("done");
|
|
169
|
-
});
|
|
170
|
-
it("promotes running to done with scannedAt only", () => {
|
|
171
|
-
expect(resolvePipelineStatus("running", {
|
|
172
|
-
scannedAt: "2026-01-01T00:00:00.000Z",
|
|
173
|
-
})).toBe("done");
|
|
174
|
-
});
|
|
175
|
-
it("keeps running when no completion evidence", () => {
|
|
176
|
-
expect(resolvePipelineStatus("running", {})).toBe("running");
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
describe("isPipelineCardSummary", () => {
|
|
180
|
-
it("detects scanning placeholder summaries", () => {
|
|
181
|
-
expect(isPipelineCardSummary(pipelineCard({
|
|
182
|
-
pipeline: {
|
|
183
|
-
status: "queued",
|
|
184
|
-
headline: scanSurfaceCopy.pipeline.scanRunning,
|
|
185
|
-
subheadline: scanSurfaceCopy.pipeline.scanIncomplete,
|
|
186
|
-
},
|
|
187
|
-
}))).toBe(true);
|
|
188
|
-
});
|
|
189
|
-
it("detects failed pipeline summaries", () => {
|
|
190
|
-
expect(isPipelineCardSummary(pipelineCard({
|
|
191
|
-
pipeline: {
|
|
192
|
-
status: "failed",
|
|
193
|
-
headline: scanSurfaceCopy.pipeline.analysisIncomplete,
|
|
194
|
-
},
|
|
195
|
-
}))).toBe(true);
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
describe("isPipelinePlaceholderCopy", () => {
|
|
199
|
-
it("identifies waiting copy", () => {
|
|
200
|
-
expect(isPipelinePlaceholderCopy("Waiting for results...")).toBe(true);
|
|
201
|
-
expect(isPipelinePlaceholderCopy("Auth change")).toBe(false);
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
describe("deriveScanCardSummaryFromDenormalized", () => {
|
|
205
|
-
it("builds risky summary from denormalized columns", () => {
|
|
206
|
-
const summary = deriveScanCardSummaryFromDenormalized("risky", 72, "Auth boundary change", "done");
|
|
207
|
-
expect(summary.status).toBe("risky");
|
|
208
|
-
expect(summary.riskIndex).toBe(72);
|
|
209
|
-
expect(summary.pipeline).toBeUndefined();
|
|
210
|
-
});
|
|
211
|
-
it("does not inject pipeline placeholder summaryText", () => {
|
|
212
|
-
const summary = deriveScanCardSummaryFromDenormalized("risky", 72, "Waiting for results...", "done");
|
|
213
|
-
expect(summary.status).toBe("risky");
|
|
214
|
-
expect(summary.pipeline).toBeUndefined();
|
|
215
|
-
});
|
|
216
|
-
it("does not inject raw generic summaryText on quiet safe cards", () => {
|
|
217
|
-
const summary = deriveScanCardSummaryFromDenormalized("safe", 12, "No high-confidence merge risks from this PR dependency change", "done");
|
|
218
|
-
expect(summary.status).toBe("safe");
|
|
219
|
-
expect(summary.pipeline).toBeUndefined();
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
describe("resolvePrScanCardSummary", () => {
|
|
223
|
-
it("returns risk summary when wire status is running but decision exists", () => {
|
|
224
|
-
const summary = resolvePrScanCardSummary({
|
|
225
|
-
pipelineStatus: "running",
|
|
226
|
-
decision: "risky",
|
|
227
|
-
totalScore: 80,
|
|
228
|
-
summaryText: "Waiting for results...",
|
|
229
|
-
result: null,
|
|
230
|
-
});
|
|
231
|
-
expect(summary.status).toBe("risky");
|
|
232
|
-
expect(summary.pipeline).toBeUndefined();
|
|
233
|
-
});
|
|
234
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanDetailViewModel.d.ts","sourceRoot":"","sources":["../src/scanDetailViewModel.ts"],"names":[],"mappings":"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"}
|