@mergesignal/shared 0.2.3 → 0.2.5

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deriveScanDetailRecommendations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deriveScanDetailRecommendations.test.d.ts","sourceRoot":"","sources":["../src/deriveScanDetailRecommendations.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,181 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { primaryPrExample } from "./productMessaging.js";
3
+ import { deriveScanDetailRecommendations, RECOMMENDATION_MAX_ITEMS, } from "./deriveScanDetailRecommendations.js";
4
+ import { deriveScanDetailViewModel } from "./scanDetailViewModel.js";
5
+ const baseResult = {
6
+ totalScore: 10,
7
+ layerScores: {
8
+ security: 1,
9
+ maintainability: 2,
10
+ ecosystem: 3,
11
+ upgradeImpact: 4,
12
+ },
13
+ findings: [],
14
+ generatedAt: "2026-01-01T00:00:00.000Z",
15
+ };
16
+ function minimalResult(overrides = {}) {
17
+ return {
18
+ totalScore: 42,
19
+ layerScores: {
20
+ security: 10,
21
+ maintainability: 20,
22
+ ecosystem: 30,
23
+ upgradeImpact: 15,
24
+ },
25
+ findings: [],
26
+ generatedAt: new Date().toISOString(),
27
+ decision: {
28
+ recommendation: "needs_review",
29
+ confidence: "medium",
30
+ reasoning: ["Lockfile adds transitive depth on shared utilities."],
31
+ },
32
+ ...overrides,
33
+ };
34
+ }
35
+ describe("deriveScanDetailRecommendations", () => {
36
+ it("always returns 1–3 enriched items with detail fields", () => {
37
+ const archetypes = [
38
+ {
39
+ ...baseResult,
40
+ decision: { recommendation: "safe", confidence: "high", reasoning: [] },
41
+ },
42
+ minimalResult(),
43
+ {
44
+ ...minimalResult(),
45
+ decision: {
46
+ recommendation: "risky",
47
+ confidence: "high",
48
+ reasoning: [],
49
+ },
50
+ findings: [
51
+ {
52
+ id: "f1",
53
+ severity: "critical",
54
+ title: "Critical vulnerability",
55
+ description: "Transitive CVE",
56
+ packageName: "lodash",
57
+ recommendation: "Upgrade lodash",
58
+ },
59
+ ],
60
+ },
61
+ ];
62
+ for (const result of archetypes) {
63
+ const center = deriveScanDetailRecommendations(result);
64
+ expect(center.items.length).toBeGreaterThanOrEqual(1);
65
+ expect(center.items.length).toBeLessThanOrEqual(RECOMMENDATION_MAX_ITEMS);
66
+ expect(center.defaultSelectedId).toBe(center.items[0]?.id);
67
+ for (const item of center.items) {
68
+ expect(item.detail.why.length).toBeGreaterThan(0);
69
+ expect(item.detail.whyNow.length).toBeGreaterThan(0);
70
+ expect(item.detail.expectedBenefit.length).toBeGreaterThan(0);
71
+ expect(item.detail.why).not.toMatch(/CVE-\d|@\d|\d+\.\d+\.\d+/);
72
+ }
73
+ }
74
+ });
75
+ it("quiet safe scan uses posture playbook with scan context", () => {
76
+ const center = deriveScanDetailRecommendations({
77
+ ...baseResult,
78
+ decision: { recommendation: "safe", confidence: "high", reasoning: [] },
79
+ });
80
+ expect(center.posture).toBe("safe");
81
+ expect(center.scanContext).toBeTruthy();
82
+ expect(center.items[0]?.priority).toBe("low");
83
+ expect(center.items[0]?.title).toBe("Merge normally");
84
+ });
85
+ it("duplicate recommendation includes whyNow and signals with packages", () => {
86
+ const center = deriveScanDetailRecommendations({
87
+ ...minimalResult(),
88
+ recommendations: [
89
+ {
90
+ id: "r1",
91
+ title: "Reduce duplicate dependency versions",
92
+ rationale: "semver overlap",
93
+ impact: "high",
94
+ packages: ["semver", "string-width", "@opentelemetry/api-logs"],
95
+ },
96
+ ],
97
+ });
98
+ const dup = center.items.find((i) => i.title.toLowerCase().includes("duplicate"));
99
+ expect(dup?.detail.whyNow.toLowerCase()).toContain("semver");
100
+ expect(dup?.detail.signals.length).toBeGreaterThan(0);
101
+ expect(dup?.detail.affectedPackages?.names).toContain("semver");
102
+ });
103
+ it("insight-rich scan has high priority and scan-specific whyNow", () => {
104
+ const center = deriveScanDetailRecommendations({
105
+ ...minimalResult(),
106
+ insights: [
107
+ {
108
+ type: "behavioral_change",
109
+ priority: "high",
110
+ confidence: "confirmed",
111
+ scope: "changed",
112
+ message: primaryPrExample.message,
113
+ context: primaryPrExample.where[0],
114
+ remediation: "Confirm auth guards still run before protected handlers",
115
+ affectedFiles: [...primaryPrExample.where],
116
+ },
117
+ ],
118
+ });
119
+ expect(center.items[0]?.source).toBe("insight");
120
+ expect(center.items[0]?.priority).toBe("high");
121
+ expect(center.items[0]?.detail.whyNow).toContain("middleware");
122
+ });
123
+ it("risky scan with critical findings leads with resolve guidance", () => {
124
+ const center = deriveScanDetailRecommendations({
125
+ ...minimalResult(),
126
+ decision: { recommendation: "risky", confidence: "high", reasoning: [] },
127
+ findings: [
128
+ {
129
+ id: "f1",
130
+ severity: "critical",
131
+ title: "Critical vulnerability",
132
+ description: "Transitive CVE",
133
+ packageName: "lodash",
134
+ recommendation: "Upgrade lodash",
135
+ },
136
+ ],
137
+ });
138
+ expect(center.items[0]?.title).toContain("Resolve critical findings");
139
+ expect(center.items[0]?.priority).toBe("high");
140
+ expect(center.items[0]?.proofRefs?.findingIds).toContain("f1");
141
+ });
142
+ });
143
+ describe("recommendedActions on scan detail view model", () => {
144
+ it("includes recommendedActions slice on done scans", () => {
145
+ const vm = deriveScanDetailViewModel(minimalResult(), {
146
+ scanId: "s1",
147
+ status: "done",
148
+ });
149
+ expect(vm?.recommendedActions.items.length).toBeGreaterThanOrEqual(1);
150
+ });
151
+ it("strips duplicate finding recommendations covered by recommended actions", () => {
152
+ const vm = deriveScanDetailViewModel({
153
+ ...minimalResult(),
154
+ decision: {
155
+ recommendation: "risky",
156
+ confidence: "high",
157
+ reasoning: [],
158
+ },
159
+ findings: [
160
+ {
161
+ id: "f1",
162
+ severity: "critical",
163
+ title: "Critical vulnerability",
164
+ description: "Transitive CVE",
165
+ packageName: "lodash",
166
+ recommendation: "Upgrade lodash",
167
+ },
168
+ ],
169
+ }, { scanId: "dedupe", status: "done" });
170
+ const finding = vm?.evidence?.findings.find((f) => f.id === "f1");
171
+ expect(finding?.recommendation).toBeUndefined();
172
+ expect(finding?.coveredByRecommendationRank).toBeGreaterThan(0);
173
+ });
174
+ it("does not expose Act 4 next steps", () => {
175
+ const vm = deriveScanDetailViewModel(minimalResult(), {
176
+ scanId: "s1",
177
+ status: "done",
178
+ });
179
+ expect(vm).not.toHaveProperty("next");
180
+ });
181
+ });
@@ -17,4 +17,8 @@ export declare function deriveCardExposureDisplay(score: number | null | undefin
17
17
  export declare function formatCardExposureLine(score: number | null | undefined): string | null;
18
18
  /** Fragment for composite aria labels on PR cards. */
19
19
  export declare function exposureAriaFragment(score: number | null | undefined): string | null;
20
+ /** Detail-page reach chip labels (not "exposure" jargon). */
21
+ export declare const DETAIL_REACH_CHIP_LABEL: Record<CardExposureCategory, string>;
22
+ /** Reach chip for scan detail page — maps score band to reviewer-facing scope label. */
23
+ export declare function deriveDetailReachChip(score: number | null | undefined): string | null;
20
24
  //# sourceMappingURL=formatCardExposureDisplay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatCardExposureDisplay.d.ts","sourceRoot":"","sources":["../src/formatCardExposureDisplay.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GACT,SAAS,GACT,UAAU,GACV,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAUF,qEAAqE;AACrE,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAM1D,CAAC;AAkBF,0EAA0E;AAC1E,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,mBAAmB,GAAG,IAAI,CAM5B;AAED,uDAAuD;AACvD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,GAAG,IAAI,CAIf;AAED,sDAAsD;AACtD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,GAAG,IAAI,CAIf"}
1
+ {"version":3,"file":"formatCardExposureDisplay.d.ts","sourceRoot":"","sources":["../src/formatCardExposureDisplay.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GACT,SAAS,GACT,UAAU,GACV,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAUF,qEAAqE;AACrE,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAM1D,CAAC;AAkBF,0EAA0E;AAC1E,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,mBAAmB,GAAG,IAAI,CAM5B;AAED,uDAAuD;AACvD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,GAAG,IAAI,CAIf;AAED,sDAAsD;AACtD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,GAAG,IAAI,CAIf;AAED,6DAA6D;AAC7D,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAMxE,CAAC;AAEF,wFAAwF;AACxF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,GAAG,IAAI,CAIf"}
@@ -54,3 +54,18 @@ export function exposureAriaFragment(score) {
54
54
  return null;
55
55
  return display.label;
56
56
  }
57
+ /** Detail-page reach chip labels (not "exposure" jargon). */
58
+ export const DETAIL_REACH_CHIP_LABEL = {
59
+ minimal: "Focused reach",
60
+ limited: "Limited reach",
61
+ moderate: "Moderate reach",
62
+ elevated: "Wide reach",
63
+ broad: "Wide reach",
64
+ };
65
+ /** Reach chip for scan detail page — maps score band to reviewer-facing scope label. */
66
+ export function deriveDetailReachChip(score) {
67
+ const display = deriveCardExposureDisplay(score);
68
+ if (!display)
69
+ return null;
70
+ return DETAIL_REACH_CHIP_LABEL[display.category];
71
+ }
package/dist/index.d.ts CHANGED
@@ -12,6 +12,9 @@ export * from "./cardObservationCatalog.js";
12
12
  export * from "./deriveCardOperationalObservations.js";
13
13
  export * from "./deriveCardDisplaySummary.js";
14
14
  export * from "./scanCardSummary.js";
15
+ export * from "./deriveScanDetailRecommendations.js";
16
+ export * from "./deriveRiskScoreSummary.js";
17
+ export * from "./scanDetailViewModel.js";
15
18
  export * from "./scanResultSchema.js";
16
19
  export * from "./scanSurfaceCopy.js";
17
20
  export * from "./trustedScanGuards.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -12,6 +12,9 @@ export * from "./cardObservationCatalog.js";
12
12
  export * from "./deriveCardOperationalObservations.js";
13
13
  export * from "./deriveCardDisplaySummary.js";
14
14
  export * from "./scanCardSummary.js";
15
+ export * from "./deriveScanDetailRecommendations.js";
16
+ export * from "./deriveRiskScoreSummary.js";
17
+ export * from "./scanDetailViewModel.js";
15
18
  export * from "./scanResultSchema.js";
16
19
  export * from "./scanSurfaceCopy.js";
17
20
  export * from "./trustedScanGuards.js";
@@ -0,0 +1,108 @@
1
+ import { type ScanDetailRecommendationCenter } from "./deriveScanDetailRecommendations.js";
2
+ import { type ScanDetailSignalSummary } from "./deriveRiskScoreSummary.js";
3
+ import { type MergePosture } from "./riskVocabulary.js";
4
+ import type { FindingSeverity, ScanResult } from "./types.js";
5
+ export declare const ACT2_MAX_THEMES = 4;
6
+ export declare const ACT2_MAX_THEME_CHARS = 80;
7
+ export declare const VERDICT_LINE_MAX_CHARS = 120;
8
+ export declare const TIER1_MAX_VISIBLE_IMPACTS = 3;
9
+ export declare const ACT3_EVIDENCE_COLLAPSE_THRESHOLD = 10;
10
+ export type ScanDetailOperationalImpactItem = {
11
+ message: string;
12
+ where?: string;
13
+ verify?: string;
14
+ affectedFiles?: string[];
15
+ };
16
+ export type ScanDetailOperationalImpact = {
17
+ status: "rich" | "fallback" | "hidden";
18
+ items: ScanDetailOperationalImpactItem[];
19
+ fallbackMessage?: string;
20
+ };
21
+ export type ScanDetailVerdict = {
22
+ posture: MergePosture | null;
23
+ scopeChip: string | null;
24
+ verdictLine: string;
25
+ prLabel?: string;
26
+ statusLabel?: string;
27
+ };
28
+ export type ScanDetailAttentionPackage = {
29
+ name: string;
30
+ version?: string;
31
+ direct: boolean;
32
+ severity?: FindingSeverity;
33
+ evidence?: string;
34
+ };
35
+ export type ScanDetailAttentionArea = {
36
+ problemLabel: string;
37
+ problemDescription: string;
38
+ packages: ScanDetailAttentionPackage[];
39
+ overflowCount: number;
40
+ };
41
+ export type ScanDetailFindingRow = {
42
+ id: string;
43
+ severity: FindingSeverity;
44
+ title: string;
45
+ description: string;
46
+ packageName: string;
47
+ recommendation?: string;
48
+ source: "dependency" | "code";
49
+ coveredByRecommendationRank?: number;
50
+ };
51
+ export type ScanDetailTopology = {
52
+ summaryLine: string;
53
+ deepest: Array<{
54
+ packageName: string;
55
+ depth: number;
56
+ direct: boolean;
57
+ via: string[];
58
+ }>;
59
+ };
60
+ export type ScanDetailViewModel = {
61
+ verdict: ScanDetailVerdict;
62
+ signalSummary: ScanDetailSignalSummary | null;
63
+ followUpBridgeNote: string | null;
64
+ recommendedActions: ScanDetailRecommendationCenter;
65
+ operationalImpact: ScanDetailOperationalImpact;
66
+ because: {
67
+ themes: string[];
68
+ confidenceCaveat?: string;
69
+ } | null;
70
+ evidence: {
71
+ attentionAreas: ScanDetailAttentionArea[];
72
+ findings: ScanDetailFindingRow[];
73
+ findingsOverflowCount: number;
74
+ topology: ScanDetailTopology | null;
75
+ } | null;
76
+ repoContext: {
77
+ status: "hidden";
78
+ } | {
79
+ status: "loaded";
80
+ comparisonLine: string;
81
+ };
82
+ metadata: {
83
+ scanId: string;
84
+ generatedAt?: string;
85
+ methodologyVersion?: string | null;
86
+ changedPackagesSummary?: string;
87
+ codeAnalysisTimedOut?: boolean;
88
+ };
89
+ };
90
+ export type DeriveScanDetailOptions = {
91
+ scanId: string;
92
+ status: "queued" | "running" | "done" | "failed";
93
+ methodologyVersion?: string | null;
94
+ prNumber?: number | null;
95
+ repoContext?: ScanDetailViewModel["repoContext"];
96
+ };
97
+ /** Bridge copy from Signal summary to Recommended actions. */
98
+ export declare function deriveFollowUpBridgeNote(actionCount: number): string | null;
99
+ /** Act 2 theme sanitizer — strips package/CVE/version content. */
100
+ export declare function sanitizeAct2Theme(raw: string): string | null;
101
+ /** Verdict line from posture + reach band (scanSurfaceCopy.scanDetail.verdictLine). */
102
+ export declare function deriveVerdictLine(posture: MergePosture | null, totalScore: number | null | undefined): string;
103
+ export declare function deriveAct2Themes(result: ScanResult): string[];
104
+ export declare function deriveOperationalImpact(result: ScanResult, verifyLabels?: Set<string>): ScanDetailOperationalImpact;
105
+ export declare function deriveScanDetailViewModel(result: ScanResult | null | undefined, options: DeriveScanDetailOptions): ScanDetailViewModel | null;
106
+ /** Tier 1 recall test helper — true when message describes application-level impact. */
107
+ export declare function tier1PassesRecallTest(operationalImpact: ScanDetailOperationalImpact): boolean;
108
+ //# sourceMappingURL=scanDetailViewModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanDetailViewModel.d.ts","sourceRoot":"","sources":["../src/scanDetailViewModel.ts"],"names":[],"mappings":"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"}