@mergesignal/shared 0.2.8 → 0.4.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.
Files changed (128) hide show
  1. package/dist/deriveScanNarrative.d.ts +0 -3
  2. package/dist/deriveScanNarrative.d.ts.map +1 -1
  3. package/dist/deriveScanNarrative.js +30 -19
  4. package/dist/deriveScanNarrative.test.js +37 -8
  5. package/dist/engineWireRegression.test.d.ts +2 -0
  6. package/dist/engineWireRegression.test.d.ts.map +1 -0
  7. package/dist/engineWireRegression.test.js +57 -0
  8. package/dist/fixtures/legacyEngineRepoIntelligence.d.ts +28 -0
  9. package/dist/fixtures/legacyEngineRepoIntelligence.d.ts.map +1 -0
  10. package/dist/fixtures/legacyEngineRepoIntelligence.js +28 -0
  11. package/dist/fixtures/repoIntelligenceFixtures.d.ts +0 -2
  12. package/dist/fixtures/repoIntelligenceFixtures.d.ts.map +1 -1
  13. package/dist/fixtures/repoIntelligenceFixtures.js +14 -4
  14. package/dist/fixtures/repoIntelligenceTestHelpers.d.ts +5 -0
  15. package/dist/fixtures/repoIntelligenceTestHelpers.d.ts.map +1 -0
  16. package/dist/fixtures/repoIntelligenceTestHelpers.js +28 -0
  17. package/dist/index.d.ts +4 -2
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +4 -2
  20. package/dist/narrativeParity.test.js +21 -19
  21. package/dist/narrativePresentation.test.js +2 -1
  22. package/dist/presentGitHubPrComment.d.ts +3 -4
  23. package/dist/presentGitHubPrComment.d.ts.map +1 -1
  24. package/dist/presentGitHubPrComment.js +15 -61
  25. package/dist/presentation/compose/narrativeCompose.d.ts +16 -0
  26. package/dist/presentation/compose/narrativeCompose.d.ts.map +1 -0
  27. package/dist/presentation/compose/narrativeCompose.js +167 -0
  28. package/dist/presentation/dto/githubAndCliPresentation.d.ts +53 -0
  29. package/dist/presentation/dto/githubAndCliPresentation.d.ts.map +1 -0
  30. package/dist/presentation/dto/githubAndCliPresentation.js +1 -0
  31. package/dist/presentation/dto/scanCardPresentation.d.ts +25 -0
  32. package/dist/presentation/dto/scanCardPresentation.d.ts.map +1 -0
  33. package/dist/presentation/dto/scanCardPresentation.js +1 -0
  34. package/dist/presentation/dto/scanDetailsPresentation.d.ts +111 -0
  35. package/dist/presentation/dto/scanDetailsPresentation.d.ts.map +1 -0
  36. package/dist/presentation/dto/scanDetailsPresentation.js +1 -0
  37. package/dist/presentation/dto/types.d.ts +24 -0
  38. package/dist/presentation/dto/types.d.ts.map +1 -0
  39. package/dist/presentation/dto/types.js +22 -0
  40. package/dist/presentation/fixtures/scanResultFixtures.d.ts +5 -0
  41. package/dist/presentation/fixtures/scanResultFixtures.d.ts.map +1 -0
  42. package/dist/presentation/fixtures/scanResultFixtures.js +83 -0
  43. package/dist/presentation/index.d.ts +25 -0
  44. package/dist/presentation/index.d.ts.map +1 -0
  45. package/dist/presentation/index.js +13 -0
  46. package/dist/presentation/orchestration/buildScanCardPresentation.d.ts +11 -0
  47. package/dist/presentation/orchestration/buildScanCardPresentation.d.ts.map +1 -0
  48. package/dist/presentation/orchestration/buildScanCardPresentation.js +44 -0
  49. package/dist/presentation/orchestration/buildScanDetailsPresentation.d.ts +14 -0
  50. package/dist/presentation/orchestration/buildScanDetailsPresentation.d.ts.map +1 -0
  51. package/dist/presentation/orchestration/buildScanDetailsPresentation.js +19 -0
  52. package/dist/presentation/orchestration/buildScanPresentationBundle.d.ts +15 -0
  53. package/dist/presentation/orchestration/buildScanPresentationBundle.d.ts.map +1 -0
  54. package/dist/presentation/orchestration/buildScanPresentationBundle.js +23 -0
  55. package/dist/presentation/orchestration/scanPresentationBundle.d.ts +15 -0
  56. package/dist/presentation/orchestration/scanPresentationBundle.d.ts.map +1 -0
  57. package/dist/presentation/orchestration/scanPresentationBundle.js +1 -0
  58. package/dist/presentation/presentation.test.d.ts +2 -0
  59. package/dist/presentation/presentation.test.d.ts.map +1 -0
  60. package/dist/presentation/presentation.test.js +95 -0
  61. package/dist/presentation/presenters/presentCliScanSummary.d.ts +6 -0
  62. package/dist/presentation/presenters/presentCliScanSummary.d.ts.map +1 -0
  63. package/dist/presentation/presenters/presentCliScanSummary.js +30 -0
  64. package/dist/presentation/presenters/presentGitHubCheckRun.d.ts +8 -0
  65. package/dist/presentation/presenters/presentGitHubCheckRun.d.ts.map +1 -0
  66. package/dist/presentation/presenters/presentGitHubCheckRun.js +32 -0
  67. package/dist/presentation/presenters/presentGitHubPrComment.d.ts +4 -0
  68. package/dist/presentation/presenters/presentGitHubPrComment.d.ts.map +1 -0
  69. package/dist/presentation/presenters/presentGitHubPrComment.js +40 -0
  70. package/dist/presentation/presenters/presentPipelineScanCard.d.ts +3 -0
  71. package/dist/presentation/presenters/presentPipelineScanCard.d.ts.map +1 -0
  72. package/dist/presentation/presenters/presentPipelineScanCard.js +23 -0
  73. package/dist/presentation/presenters/presentScanCard.d.ts +7 -0
  74. package/dist/presentation/presenters/presentScanCard.d.ts.map +1 -0
  75. package/dist/presentation/presenters/presentScanCard.js +43 -0
  76. package/dist/presentation/presenters/presentScanDetails.d.ts +9 -0
  77. package/dist/presentation/presenters/presentScanDetails.d.ts.map +1 -0
  78. package/dist/presentation/presenters/presentScanDetails.js +177 -0
  79. package/dist/presentation/profile/derivePresentationProfile.d.ts +12 -0
  80. package/dist/presentation/profile/derivePresentationProfile.d.ts.map +1 -0
  81. package/dist/presentation/profile/derivePresentationProfile.js +86 -0
  82. package/dist/presentation/profile/presentationProfile.d.ts +9 -0
  83. package/dist/presentation/profile/presentationProfile.d.ts.map +1 -0
  84. package/dist/presentation/profile/presentationProfile.js +1 -0
  85. package/dist/presentation/render/renderCliScanSummaryText.d.ts +3 -0
  86. package/dist/presentation/render/renderCliScanSummaryText.d.ts.map +1 -0
  87. package/dist/presentation/render/renderCliScanSummaryText.js +30 -0
  88. package/dist/presentation/render/renderGitHubCheckRunMarkdown.d.ts +3 -0
  89. package/dist/presentation/render/renderGitHubCheckRunMarkdown.d.ts.map +1 -0
  90. package/dist/presentation/render/renderGitHubCheckRunMarkdown.js +23 -0
  91. package/dist/presentation/render/renderGitHubPrCommentMarkdown.d.ts +3 -0
  92. package/dist/presentation/render/renderGitHubPrCommentMarkdown.d.ts.map +1 -0
  93. package/dist/presentation/render/renderGitHubPrCommentMarkdown.js +24 -0
  94. package/dist/repoIntelligenceMappers.d.ts +20 -0
  95. package/dist/repoIntelligenceMappers.d.ts.map +1 -0
  96. package/dist/repoIntelligenceMappers.js +60 -0
  97. package/dist/repoIntelligenceSchema.contract.test.d.ts +2 -0
  98. package/dist/repoIntelligenceSchema.contract.test.d.ts.map +1 -0
  99. package/dist/repoIntelligenceSchema.contract.test.js +19 -0
  100. package/dist/repoIntelligenceSchema.d.ts +52 -83
  101. package/dist/repoIntelligenceSchema.d.ts.map +1 -1
  102. package/dist/repoIntelligenceSchema.js +99 -141
  103. package/dist/repoIntelligenceValidation.d.ts +18 -0
  104. package/dist/repoIntelligenceValidation.d.ts.map +1 -0
  105. package/dist/repoIntelligenceValidation.js +76 -0
  106. package/dist/repoIntelligenceValidation.persist.test.d.ts +2 -0
  107. package/dist/repoIntelligenceValidation.persist.test.d.ts.map +1 -0
  108. package/dist/repoIntelligenceValidation.persist.test.js +44 -0
  109. package/dist/scanCardSummary.d.ts +4 -35
  110. package/dist/scanCardSummary.d.ts.map +1 -1
  111. package/dist/scanCardSummary.js +12 -63
  112. package/dist/scanCardSummary.test.js +56 -75
  113. package/dist/scanDetailViewModel.d.ts +1 -0
  114. package/dist/scanDetailViewModel.d.ts.map +1 -1
  115. package/dist/scanDetailViewModel.js +1 -1
  116. package/dist/scanDetailViewModel.test.js +2 -1
  117. package/dist/scanNarrativeFacts.d.ts +2 -0
  118. package/dist/scanNarrativeFacts.d.ts.map +1 -1
  119. package/dist/scanNarrativeFacts.js +1 -0
  120. package/dist/scanSurfaceCopy.d.ts +25 -0
  121. package/dist/scanSurfaceCopy.d.ts.map +1 -1
  122. package/dist/scanSurfaceCopy.js +25 -0
  123. package/dist/types.d.ts +15 -3
  124. package/dist/types.d.ts.map +1 -1
  125. package/package.json +1 -1
  126. package/dist/presentScanCardSummary.d.ts +0 -16
  127. package/dist/presentScanCardSummary.d.ts.map +0 -1
  128. package/dist/presentScanCardSummary.js +0 -212
@@ -1,212 +0,0 @@
1
- import { isCatalogPhrase, phraseForFamily, } from "./cardObservationCatalog.js";
2
- import { aggregateFindingCounts, deriveRiskIndexBand, SCAN_CARD_SCANNING_SUMMARY, } from "./scanCardSummary.js";
3
- import { deriveCardExposureDisplay, } from "./formatCardExposureDisplay.js";
4
- import { formatCardAreaLabels } from "./formatCardAreaLabels.js";
5
- import { composeContextLineFromFacts, composeVerificationPrompt, formatBlastRadiusDetailLine, formatChangedPackagesShort, formatFrameworksSummary, formatUsageSummaryLine, labelBlastRadiusLevel, labelReachabilityKind, labelRuntimeSurface, } from "./narrativePresentation.js";
6
- import { normalizeGeneratedText, normalizeGeneratedTextNullable, } from "./normalizeGeneratedText.js";
7
- import { MERGE_POSTURE_LABEL } from "./riskVocabulary.js";
8
- import { scanSurfaceCopy } from "./scanSurfaceCopy.js";
9
- function formatAffectedAreaLabels(facts) {
10
- const ordered = [];
11
- for (const area of facts.affectedAreas) {
12
- const formatted = formatCardAreaLabels([area.label], 1);
13
- if (formatted[0])
14
- ordered.push(formatted[0]);
15
- if (ordered.length >= 2)
16
- break;
17
- }
18
- return ordered;
19
- }
20
- function selectPrimaryInsight(facts) {
21
- const changedGuidance = facts.reviewerGuidance.find((g) => g.scope === "changed" && g.message.trim());
22
- if (changedGuidance)
23
- return changedGuidance.message.trim();
24
- const insight = facts.reviewerGuidance.find((g) => g.kind === "insight" && g.message.trim());
25
- if (insight)
26
- return insight.message.trim();
27
- return null;
28
- }
29
- function selectSecondaryLines(facts, exclude) {
30
- const lines = [];
31
- for (const g of facts.reviewerGuidance) {
32
- const msg = g.message.trim();
33
- if (!msg || msg === exclude)
34
- continue;
35
- lines.push(msg);
36
- if (lines.length >= 2)
37
- break;
38
- }
39
- return lines;
40
- }
41
- function repositoryContextPhrases(facts, max) {
42
- const phrases = [];
43
- const seen = new Set();
44
- for (const ctx of facts.repositoryContext) {
45
- const phrase = phraseForFamily(ctx.family);
46
- if (seen.has(phrase))
47
- continue;
48
- seen.add(phrase);
49
- phrases.push(phrase);
50
- if (phrases.length >= max)
51
- break;
52
- }
53
- return phrases;
54
- }
55
- function buildLegacyObservations(facts, primaryInsight, repoPhraseCap) {
56
- const repoPhrases = repositoryContextPhrases(facts, repoPhraseCap);
57
- const secondary = selectSecondaryLines(facts, primaryInsight);
58
- if (primaryInsight) {
59
- return {
60
- operationalObservations: repoPhrases.slice(0, 1),
61
- supportingLine: repoPhrases[0] && repoPhrases[0] !== primaryInsight
62
- ? repoPhrases[0]
63
- : (secondary[0] ?? null),
64
- };
65
- }
66
- if (repoPhrases.length === 0) {
67
- return { operationalObservations: [], supportingLine: null };
68
- }
69
- return {
70
- operationalObservations: repoPhrases.slice(0, repoPhraseCap),
71
- supportingLine: repoPhrases.length === 1 ? (secondary[0] ?? null) : null,
72
- };
73
- }
74
- function normalizeCardSummary(summary) {
75
- return {
76
- ...summary,
77
- headline: normalizeGeneratedText(summary.headline),
78
- summaryLine: normalizeGeneratedTextNullable(summary.summaryLine),
79
- supportingLine: normalizeGeneratedTextNullable(summary.supportingLine),
80
- changedPackagesDisplay: normalizeGeneratedTextNullable(summary.changedPackagesDisplay),
81
- runtimeSurfaceLabel: normalizeGeneratedTextNullable(summary.runtimeSurfaceLabel),
82
- reachabilityLabel: normalizeGeneratedTextNullable(summary.reachabilityLabel),
83
- blastRadiusLabel: normalizeGeneratedTextNullable(summary.blastRadiusLabel),
84
- primaryInsight: normalizeGeneratedTextNullable(summary.primaryInsight),
85
- structuralOnlyDisclaimer: normalizeGeneratedTextNullable(summary.structuralOnlyDisclaimer),
86
- usageSummary: normalizeGeneratedTextNullable(summary.usageSummary),
87
- verificationLine: normalizeGeneratedTextNullable(summary.verificationLine),
88
- blastRadiusDetail: normalizeGeneratedTextNullable(summary.blastRadiusDetail),
89
- frameworksSummary: normalizeGeneratedTextNullable(summary.frameworksSummary),
90
- affectedAreas: summary.affectedAreas.map((a) => normalizeGeneratedText(a)),
91
- topAffectedAreas: summary.topAffectedAreas.map((a) => normalizeGeneratedText(a)),
92
- operationalObservations: summary.operationalObservations.map((p) => {
93
- const normalized = normalizeGeneratedText(p);
94
- return isCatalogPhrase(normalized) ? normalized : p;
95
- }),
96
- };
97
- }
98
- /**
99
- * Dashboard card presentation DTO from consumer-agnostic facts.
100
- */
101
- export function presentScanCardSummary(facts, options = {}) {
102
- const pipelineStatus = options.pipelineStatus ?? "done";
103
- const emptyPresentationFields = {
104
- narrativeMode: facts.availability.mode,
105
- codeIntelligenceAvailable: facts.availability.codeIntelligenceAvailable,
106
- changedPackagesDisplay: null,
107
- runtimeSurfaceLabel: null,
108
- reachabilityLabel: null,
109
- blastRadiusLabel: null,
110
- affectedAreas: [],
111
- primaryInsight: null,
112
- structuralOnlyDisclaimer: null,
113
- usageSummary: null,
114
- verificationLine: null,
115
- blastRadiusDetail: null,
116
- frameworksSummary: null,
117
- };
118
- if (pipelineStatus === "queued" || pipelineStatus === "running") {
119
- return normalizeCardSummary({
120
- mergePosture: null,
121
- riskIndex: null,
122
- riskIndexBand: null,
123
- headline: scanSurfaceCopy.pipeline.scanRunning,
124
- summaryLine: SCAN_CARD_SCANNING_SUMMARY,
125
- findingCounts: null,
126
- topAffectedAreas: [],
127
- operationalObservations: [],
128
- supportingLine: null,
129
- ...emptyPresentationFields,
130
- });
131
- }
132
- if (pipelineStatus === "failed") {
133
- return normalizeCardSummary({
134
- mergePosture: null,
135
- riskIndex: null,
136
- riskIndexBand: null,
137
- headline: scanSurfaceCopy.pipeline.analysisIncomplete,
138
- summaryLine: null,
139
- findingCounts: null,
140
- topAffectedAreas: [],
141
- operationalObservations: [],
142
- supportingLine: null,
143
- ...emptyPresentationFields,
144
- });
145
- }
146
- const posture = facts.mergePosture;
147
- const riskIndex = facts.riskIndex;
148
- const riskIndexBand = deriveRiskIndexBand(riskIndex);
149
- const headline = posture
150
- ? MERGE_POSTURE_LABEL[posture]
151
- : scanSurfaceCopy.checkRun.mergePostureUnavailable;
152
- const findingCounts = options.findings
153
- ? aggregateFindingCounts(options.findings)
154
- : null;
155
- const prIntelligence = facts.availability.mode === "pr_intelligence" ||
156
- facts.availability.tiersPresent.tier1;
157
- const changedPackagesDisplay = formatChangedPackagesShort(facts, 2);
158
- const runtimeSurfaceLabel = labelRuntimeSurface(facts);
159
- const reachabilityLabel = labelReachabilityKind(facts);
160
- const blastRadiusLabel = labelBlastRadiusLevel(facts);
161
- const affectedAreas = formatAffectedAreaLabels(facts);
162
- const contextLine = composeContextLineFromFacts(facts, {
163
- includePathSample: prIntelligence,
164
- maxAreas: 2,
165
- });
166
- const structuralOnlyDisclaimer = facts.availability.mode === "graph_fallback" &&
167
- !facts.availability.tiersPresent.tier1
168
- ? scanSurfaceCopy.narrativeCard.structuralOnlyDisclaimer
169
- : null;
170
- const insightMessage = selectPrimaryInsight(facts);
171
- const primaryInsight = insightMessage ??
172
- (facts.availability.mode !== "graph_fallback" ? contextLine : null);
173
- const usageSummary = prIntelligence ? formatUsageSummaryLine(facts, 1) : null;
174
- const verificationLine = prIntelligence
175
- ? composeVerificationPrompt(facts)
176
- : null;
177
- const blastRadiusDetail = prIntelligence
178
- ? formatBlastRadiusDetailLine(facts, 1)
179
- : null;
180
- const frameworksSummary = prIntelligence
181
- ? formatFrameworksSummary(facts, 2)
182
- : null;
183
- const repoPhraseCap = prIntelligence ? 0 : 3;
184
- const { operationalObservations, supportingLine } = buildLegacyObservations(facts, primaryInsight, repoPhraseCap);
185
- return normalizeCardSummary({
186
- mergePosture: posture,
187
- riskIndex,
188
- riskIndexBand,
189
- headline,
190
- summaryLine: null,
191
- findingCounts,
192
- topAffectedAreas: affectedAreas,
193
- operationalObservations,
194
- supportingLine,
195
- narrativeMode: facts.availability.mode,
196
- codeIntelligenceAvailable: facts.availability.codeIntelligenceAvailable,
197
- changedPackagesDisplay,
198
- runtimeSurfaceLabel,
199
- reachabilityLabel,
200
- blastRadiusLabel,
201
- affectedAreas,
202
- primaryInsight,
203
- structuralOnlyDisclaimer,
204
- usageSummary,
205
- verificationLine,
206
- blastRadiusDetail,
207
- frameworksSummary,
208
- });
209
- }
210
- export function exposureFromFacts(facts) {
211
- return deriveCardExposureDisplay(facts.riskIndex) ?? null;
212
- }