@mergesignal/shared 0.2.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 (61) hide show
  1. package/dist/actionsStepSummary.d.ts +29 -0
  2. package/dist/actionsStepSummary.d.ts.map +1 -0
  3. package/dist/actionsStepSummary.js +757 -0
  4. package/dist/actionsStepSummary.test.d.ts +2 -0
  5. package/dist/actionsStepSummary.test.d.ts.map +1 -0
  6. package/dist/actionsStepSummary.test.js +348 -0
  7. package/dist/deriveScanSummaryText.d.ts +7 -0
  8. package/dist/deriveScanSummaryText.d.ts.map +1 -0
  9. package/dist/deriveScanSummaryText.js +24 -0
  10. package/dist/deriveScanSummaryText.test.d.ts +2 -0
  11. package/dist/deriveScanSummaryText.test.d.ts.map +1 -0
  12. package/dist/deriveScanSummaryText.test.js +77 -0
  13. package/dist/formatInsight.d.ts +10 -0
  14. package/dist/formatInsight.d.ts.map +1 -0
  15. package/dist/formatInsight.js +49 -0
  16. package/dist/formatInsight.test.d.ts +2 -0
  17. package/dist/formatInsight.test.d.ts.map +1 -0
  18. package/dist/formatInsight.test.js +102 -0
  19. package/dist/index.d.ts +11 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +10 -0
  22. package/dist/prCheckRunPresentation.d.ts +67 -0
  23. package/dist/prCheckRunPresentation.d.ts.map +1 -0
  24. package/dist/prCheckRunPresentation.js +314 -0
  25. package/dist/prCheckRunPresentation.test.d.ts +2 -0
  26. package/dist/prCheckRunPresentation.test.d.ts.map +1 -0
  27. package/dist/prCheckRunPresentation.test.js +277 -0
  28. package/dist/riskVocabulary.d.ts +31 -0
  29. package/dist/riskVocabulary.d.ts.map +1 -0
  30. package/dist/riskVocabulary.js +62 -0
  31. package/dist/riskVocabulary.test.d.ts +2 -0
  32. package/dist/riskVocabulary.test.d.ts.map +1 -0
  33. package/dist/riskVocabulary.test.js +14 -0
  34. package/dist/scanResultSchema.d.ts +116 -0
  35. package/dist/scanResultSchema.d.ts.map +1 -0
  36. package/dist/scanResultSchema.js +100 -0
  37. package/dist/scanResultSchema.test.d.ts +2 -0
  38. package/dist/scanResultSchema.test.d.ts.map +1 -0
  39. package/dist/scanResultSchema.test.js +105 -0
  40. package/dist/scanSurfaceCopy.d.ts +90 -0
  41. package/dist/scanSurfaceCopy.d.ts.map +1 -0
  42. package/dist/scanSurfaceCopy.js +104 -0
  43. package/dist/scanSurfaceCopy.test.d.ts +2 -0
  44. package/dist/scanSurfaceCopy.test.d.ts.map +1 -0
  45. package/dist/scanSurfaceCopy.test.js +14 -0
  46. package/dist/selectTopAffectedAreas.d.ts +17 -0
  47. package/dist/selectTopAffectedAreas.d.ts.map +1 -0
  48. package/dist/selectTopAffectedAreas.js +80 -0
  49. package/dist/selectTopAffectedAreas.test.d.ts +2 -0
  50. package/dist/selectTopAffectedAreas.test.d.ts.map +1 -0
  51. package/dist/selectTopAffectedAreas.test.js +179 -0
  52. package/dist/trustedScanGuards.d.ts +39 -0
  53. package/dist/trustedScanGuards.d.ts.map +1 -0
  54. package/dist/trustedScanGuards.js +88 -0
  55. package/dist/trustedScanGuards.test.d.ts +2 -0
  56. package/dist/trustedScanGuards.test.d.ts.map +1 -0
  57. package/dist/trustedScanGuards.test.js +143 -0
  58. package/dist/types.d.ts +362 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +12 -0
  61. package/package.json +49 -0
@@ -0,0 +1,362 @@
1
+ export type LayerScores = {
2
+ security: number;
3
+ maintainability: number;
4
+ ecosystem: number;
5
+ upgradeImpact: number;
6
+ };
7
+ export type FindingSeverity = "low" | "medium" | "high" | "critical";
8
+ /**
9
+ * Producer-authored classification for {@link Finding}. Prefer this over inferring from `id` strings.
10
+ */
11
+ export type FindingCategory = "graph_structure" | "input_coverage" | "security_vulnerability" | "ecosystem_registry" | "ecosystem_adoption" | "ecosystem_github" | "breaking_change" | "deprecation" | "major_version" | "unknown";
12
+ /** Structured lockfile delta (optional; from worker base vs head comparison). */
13
+ export type LockfilePackageDelta = {
14
+ added: string[];
15
+ removed: string[];
16
+ /** Package names whose resolved version changed between base and head. */
17
+ updated: string[];
18
+ };
19
+ export type Finding = {
20
+ id: string;
21
+ title: string;
22
+ description: string;
23
+ severity: FindingSeverity;
24
+ packageName: string;
25
+ recommendation?: string;
26
+ /** When set, drives insight-layer mapping; omit only for external/legacy fixtures. */
27
+ category?: FindingCategory;
28
+ /** Optional structured hints (e.g. OSV ids); omit if public contract forbids extra keys. */
29
+ evidence?: Record<string, unknown>;
30
+ };
31
+ export type LockfileManager = "pnpm" | "npm" | "yarn";
32
+ export type ScanLockfileInput = {
33
+ manager: LockfileManager;
34
+ content: string;
35
+ path?: string;
36
+ };
37
+ export type RepoSource = {
38
+ provider: "github";
39
+ owner: string;
40
+ repo: string;
41
+ sha: string;
42
+ installationId: number;
43
+ };
44
+ export type CodeAnalysisMetrics = {
45
+ fromCache: boolean;
46
+ analysisTimeMs?: number;
47
+ timedOut?: boolean;
48
+ filesAnalyzed: number;
49
+ };
50
+ /** Subset of PR identity passed into analysis (no installation tokens). */
51
+ export type ScanRequestGithubContext = {
52
+ owner: string;
53
+ repo: string;
54
+ prNumber: number;
55
+ };
56
+ export type ScanRequest = {
57
+ repoId: string;
58
+ dependencyGraph: unknown;
59
+ lockfile?: ScanLockfileInput;
60
+ /** Base branch lockfile for PR scans (optional). */
61
+ baseLockfile?: ScanLockfileInput;
62
+ repoSource?: RepoSource;
63
+ /** Optional PR context for engine/logging (no installation id). */
64
+ github?: ScanRequestGithubContext;
65
+ changedPackages?: string[];
66
+ /** When both base and head lockfiles were compared in the worker. */
67
+ lockfilePackageDelta?: LockfilePackageDelta;
68
+ changedFiles?: string[];
69
+ codeAnalysisMetrics?: CodeAnalysisMetrics;
70
+ };
71
+ export type ScoreLayer = keyof LayerScores;
72
+ export type RiskConfidence = "low" | "medium" | "high";
73
+ export type RiskSignal = {
74
+ id: string;
75
+ layer: ScoreLayer;
76
+ name: string;
77
+ value: number;
78
+ weight: number;
79
+ scoreImpact: number;
80
+ evidence?: Record<string, unknown>;
81
+ };
82
+ export type ScoreContribution = {
83
+ id: string;
84
+ layer: ScoreLayer;
85
+ scoreImpact: number;
86
+ evidence?: Record<string, unknown>;
87
+ };
88
+ export type Recommendation = {
89
+ id: string;
90
+ title: string;
91
+ rationale: string;
92
+ impact: "low" | "medium" | "high";
93
+ packages?: string[];
94
+ rank?: number;
95
+ priorityScore?: number;
96
+ estimatedScoreDelta?: number;
97
+ layers?: ScoreLayer[];
98
+ evidence?: Record<string, unknown>;
99
+ };
100
+ export type PackageHealthObservation = {
101
+ name: string;
102
+ registry: "npm";
103
+ fetchedAt: string;
104
+ latestVersion: string | null;
105
+ latestPublishedAt: string | null;
106
+ modifiedAt: string | null;
107
+ deprecated: boolean;
108
+ maintainersCount: number | null;
109
+ repositoryUrl: string | null;
110
+ };
111
+ export type ScanDataset = {
112
+ packageHealth?: PackageHealthObservation[];
113
+ };
114
+ export type ExplainReason = {
115
+ id: string;
116
+ layer: ScoreLayer;
117
+ title: string;
118
+ value?: number;
119
+ scoreImpact: number;
120
+ evidence?: Record<string, unknown>;
121
+ };
122
+ export type ExplainBlock = {
123
+ reasons: ExplainReason[];
124
+ };
125
+ export type DependencyGraphInsightKind = "hidden" | "vulnerable" | "deep" | "hotspot";
126
+ export type DependencyGraphInsight = {
127
+ kind: DependencyGraphInsightKind;
128
+ packageName: string;
129
+ version?: string;
130
+ direct: boolean;
131
+ depth: number;
132
+ via?: string[];
133
+ evidence?: Record<string, unknown>;
134
+ };
135
+ export type DependencyGraphInsights = {
136
+ maxDepth: number;
137
+ nodes: number;
138
+ edges: number;
139
+ deepest?: DependencyGraphInsight[];
140
+ hotspots?: DependencyGraphInsight[];
141
+ vulnerable?: DependencyGraphInsight[];
142
+ };
143
+ export type PRInsightType = "behavioral_change" | "usage_risk" | "dependency_risk" | "hot_path_impact" | "complexity_creep";
144
+ export type PRInsightPriority = "critical" | "high" | "medium";
145
+ export type InsightConfidence = "confirmed" | "likely" | "speculative";
146
+ export type InsightScope = "changed" | "all";
147
+ /** PR-facing merge decision vocabulary per insight (emitted insights use RISKY | BLOCK only). */
148
+ export type InsightDecisionLevel = "SAFE" | "RISKY" | "BLOCK";
149
+ /** Bar for whether an insight may appear on a PR (strict gate: only `high` emits). */
150
+ export type EmissionConfidenceLevel = "low" | "medium" | "high";
151
+ /**
152
+ * Per-repo threshold controlling which emission confidence levels trigger a PR comment.
153
+ * - `'high'` → only `emissionConfidence === 'high'` (default; free tier)
154
+ * - `'medium'` → `'high' | 'medium'` (paid tier opt-in)
155
+ * - `'low'` → all confidence levels (reserved; no analyzer produces low-confidence today)
156
+ */
157
+ export type CommentThreshold = "high" | "medium" | "low";
158
+ export type PRInsight = {
159
+ type: PRInsightType;
160
+ priority: PRInsightPriority;
161
+ confidence: InsightConfidence;
162
+ scope: InsightScope;
163
+ message: string;
164
+ context: string;
165
+ remediation: string;
166
+ affectedFiles?: string[];
167
+ details?: Record<string, unknown>;
168
+ /**
169
+ * Decision-first contract. Optional on analyzer drafts; required on {@link PRInsightEmission}.
170
+ */
171
+ decisionLevel?: InsightDecisionLevel;
172
+ emissionConfidence?: EmissionConfidenceLevel;
173
+ mechanism?: string;
174
+ action?: string;
175
+ };
176
+ /** Insights returned from `analyze()` after synthesis + emission contract. */
177
+ export type PRInsightEmission = PRInsight & {
178
+ decisionLevel: InsightDecisionLevel;
179
+ emissionConfidence: EmissionConfidenceLevel;
180
+ mechanism: string;
181
+ action: string;
182
+ };
183
+ /**
184
+ * Canonical merge posture tokens for `ScanResult.decision.recommendation` and
185
+ * persisted/API `decision` fields. Analysis engines must emit **only** these
186
+ * lowercase strings (no alternate vocabularies in the wire contract).
187
+ */
188
+ export declare const MERGE_POSTURE_RECOMMENDATIONS: readonly ["safe", "needs_review", "risky"];
189
+ export type PRDecisionRecommendation = (typeof MERGE_POSTURE_RECOMMENDATIONS)[number];
190
+ export type PRDecisionConfidence = "low" | "medium" | "high";
191
+ export type PRDecision = {
192
+ recommendation: PRDecisionRecommendation;
193
+ confidence: PRDecisionConfidence;
194
+ reasoning: string[];
195
+ };
196
+ /** Presentation-only: how the engine surfaces results when PR-local signal is weak vs strong. */
197
+ export type ReportPresentationMode = "high_signal_pr" | "lightweight_pr_graph_baseline";
198
+ export type ReportPresentation = {
199
+ mode: ReportPresentationMode;
200
+ };
201
+ /**
202
+ * Optional bounded engineering trace for `MERGESIGNAL_ENGINEERING_TRACE=1`.
203
+ * Not end-user telemetry; deterministic, size-capped, for debugging narrative/emission ordering.
204
+ */
205
+ export type EngineeringTrace = {
206
+ narrativeProfileSnapshot: {
207
+ dominantKind: string;
208
+ dominantTuple: readonly [number, number, number];
209
+ runnerUpKind: string | null;
210
+ decidedAtStep: string;
211
+ marginApplied: boolean;
212
+ prChangedPackages: readonly string[];
213
+ };
214
+ explainDriverIds: readonly string[];
215
+ orderingTrace: readonly {
216
+ messagePreview: string;
217
+ narrativeTier: number;
218
+ qualityPass: boolean;
219
+ priority: PRInsightPriority;
220
+ type: PRInsightType;
221
+ }[];
222
+ emissionDrops: readonly {
223
+ ruleId: string;
224
+ }[];
225
+ analyzerContributions: Readonly<Record<string, number>>;
226
+ };
227
+ export type ScanResult = {
228
+ totalScore: number;
229
+ layerScores: LayerScores;
230
+ findings: Finding[];
231
+ methodologyVersion?: string;
232
+ confidence?: RiskConfidence;
233
+ signals?: RiskSignal[];
234
+ contributions?: ScoreContribution[];
235
+ recommendations?: Recommendation[];
236
+ dataset?: ScanDataset;
237
+ explain?: ExplainBlock;
238
+ graphInsights?: DependencyGraphInsights;
239
+ generatedAt: string;
240
+ insights?: PRInsight[];
241
+ decision?: PRDecision;
242
+ codeAnalysisMetrics?: CodeAnalysisMetrics;
243
+ /** Present when `MERGESIGNAL_ENGINEERING_TRACE=1` during analysis (bounded, deterministic). */
244
+ engineeringTrace?: EngineeringTrace;
245
+ /**
246
+ * Binary presentation policy (fallback vs high-signal). Does not drive analyzer or scoring logic.
247
+ */
248
+ reportPresentation?: ReportPresentation;
249
+ /** Echo of `ScanRequest.changedPackages` when non-empty (e.g. lockfile diff); for Check Run / UI copy. */
250
+ changedPackages?: string[];
251
+ };
252
+ /** Provenance the analysis engine must set on fresh output (historical DB rows may omit methodology). */
253
+ export type ScanProvenanceFields = Pick<ScanResult, "methodologyVersion" | "generatedAt">;
254
+ /** Result that passed strict engine-output validation (non-empty methodology). */
255
+ export type EngineEmittedScanResult = ScanResult & Required<Pick<ScanResult, "methodologyVersion">>;
256
+ export type UpgradeTarget = {
257
+ packageName: string;
258
+ targetVersion?: string;
259
+ };
260
+ export type UpgradeSimulationRequest = {
261
+ repoId: string;
262
+ currentLockfile: ScanLockfileInput;
263
+ proposedLockfile?: ScanLockfileInput;
264
+ target?: UpgradeTarget;
265
+ };
266
+ export type UpgradeSimulationDelta = {
267
+ totalScoreDelta?: number;
268
+ layerScoreDeltas?: Partial<Record<ScoreLayer, number>>;
269
+ topSignalDeltas?: Array<{
270
+ id: string;
271
+ layer: ScoreLayer;
272
+ before?: number;
273
+ after?: number;
274
+ scoreImpactBefore?: number;
275
+ scoreImpactAfter?: number;
276
+ }>;
277
+ dependencyDelta?: {
278
+ directKnown?: boolean;
279
+ directAdded: number;
280
+ directRemoved: number;
281
+ directUpdated: number;
282
+ packagesAdded: number;
283
+ packagesRemoved: number;
284
+ topDirectAdded?: string[];
285
+ topDirectRemoved?: string[];
286
+ topDirectUpdated?: string[];
287
+ };
288
+ };
289
+ export type UpgradeSimulationImpact = {
290
+ packageName?: string;
291
+ observedVersions?: string[];
292
+ fanIn?: number;
293
+ rootBlastRadius?: number;
294
+ };
295
+ export type UpgradeSimulationResult = {
296
+ before: ScanResult;
297
+ after?: ScanResult;
298
+ delta?: UpgradeSimulationDelta;
299
+ impact?: UpgradeSimulationImpact;
300
+ generatedAt: string;
301
+ };
302
+ export type BreakingChangeSource = "semver" | "changelog" | "manual";
303
+ export type BreakingChangeSeverity = "low" | "medium" | "high";
304
+ export type BreakingChange = {
305
+ source: BreakingChangeSource;
306
+ severity: BreakingChangeSeverity;
307
+ description: string;
308
+ affectedAPIs?: string[];
309
+ };
310
+ export type UsageReport = {
311
+ filesUsingPackage: string[];
312
+ importedSymbols: string[];
313
+ criticalPaths: string[];
314
+ usageCount: number;
315
+ };
316
+ export type CriticalPathScore = {
317
+ isCritical: boolean;
318
+ score: number;
319
+ reasons: string[];
320
+ };
321
+ export type ImpactInsightType = "breaking_change_used" | "breaking_change_unused" | "critical_path_affected" | "high_usage_detected" | "safe_upgrade";
322
+ export type ImpactInsightSeverity = "low" | "medium" | "high";
323
+ export type ImpactInsight = {
324
+ type: ImpactInsightType;
325
+ severity: ImpactInsightSeverity;
326
+ message: string;
327
+ affectedFiles?: string[];
328
+ affectedSymbols?: string[];
329
+ breakingChange?: BreakingChange;
330
+ };
331
+ export type PRAnalysisResult = {
332
+ decision: PRDecisionRecommendation;
333
+ breakingChanges: BreakingChange[];
334
+ usageImpact: UsageReport[];
335
+ criticalPath?: CriticalPathScore;
336
+ insights: ImpactInsight[];
337
+ generatedAt: string;
338
+ };
339
+ /** BullMQ queue name shared by API (producer) and worker (consumer). */
340
+ export declare const SCAN_QUEUE_NAME: "scan-queue";
341
+ export type ScanQueueGithubContext = {
342
+ owner: string;
343
+ repo: string;
344
+ prNumber: number;
345
+ headSha: string;
346
+ baseSha?: string;
347
+ baseRef?: string;
348
+ installationId: number;
349
+ deliveryId?: string;
350
+ };
351
+ /** BullMQ job payload for scan jobs. */
352
+ export type ScanQueueJob = {
353
+ scanId: string;
354
+ repoId: string;
355
+ dependencyGraph: unknown;
356
+ lockfile?: ScanLockfileInput;
357
+ baseLockfile?: ScanLockfileInput;
358
+ repoSource?: RepoSource;
359
+ changedFiles?: string[];
360
+ github?: ScanQueueGithubContext;
361
+ };
362
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Canonical merge posture tokens for `ScanResult.decision.recommendation` and
3
+ * persisted/API `decision` fields. Analysis engines must emit **only** these
4
+ * lowercase strings (no alternate vocabularies in the wire contract).
5
+ */
6
+ export const MERGE_POSTURE_RECOMMENDATIONS = [
7
+ "safe",
8
+ "needs_review",
9
+ "risky",
10
+ ];
11
+ /** BullMQ queue name shared by API (producer) and worker (consumer). */
12
+ export const SCAN_QUEUE_NAME = "scan-queue";
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@mergesignal/shared",
3
+ "version": "0.2.0",
4
+ "description": "MergeSignal shared scan contract, presentation policy, and trusted validation",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/MergeSignal/mergesignal.git",
14
+ "directory": "packages/shared"
15
+ },
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js",
23
+ "default": "./dist/index.js"
24
+ },
25
+ "./types": {
26
+ "types": "./dist/types.d.ts",
27
+ "import": "./dist/types.js",
28
+ "default": "./dist/types.js"
29
+ }
30
+ },
31
+ "scripts": {
32
+ "build": "tsc -p tsconfig.json && pnpm run generate:ci-copy",
33
+ "prepublishOnly": "pnpm run build",
34
+ "generate:ci-copy": "tsx scripts/emit-scan-surface-copy.ts",
35
+ "typecheck": "tsc --noEmit",
36
+ "check-types": "tsc --noEmit",
37
+ "test": "vitest run"
38
+ },
39
+ "dependencies": {
40
+ "zod": "^4.4.3"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^22.15.3",
44
+ "tsx": "^4.21.0",
45
+ "typescript": "^5.3.0",
46
+ "vitest": "^2.1.8"
47
+ },
48
+ "license": "MIT"
49
+ }