@skastr0/pulsar-core 0.1.0 → 0.1.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.
Files changed (114) hide show
  1. package/dist/ai-facts.d.ts +212 -0
  2. package/dist/ai-facts.d.ts.map +1 -0
  3. package/dist/ai-facts.js +109 -0
  4. package/dist/ai-facts.js.map +1 -0
  5. package/dist/architectural-tier.d.ts +34 -0
  6. package/dist/architectural-tier.d.ts.map +1 -0
  7. package/dist/architectural-tier.js +77 -0
  8. package/dist/architectural-tier.js.map +1 -0
  9. package/dist/baseline.d.ts +2 -2
  10. package/dist/calibration-fingerprint.d.ts.map +1 -1
  11. package/dist/calibration-fingerprint.js +1 -0
  12. package/dist/calibration-fingerprint.js.map +1 -1
  13. package/dist/calibration-model.d.ts +4 -4
  14. package/dist/calibration-model.d.ts.map +1 -1
  15. package/dist/calibration-model.js +2 -0
  16. package/dist/calibration-model.js.map +1 -1
  17. package/dist/calibration-slot-values.d.ts +51 -1
  18. package/dist/calibration-slot-values.d.ts.map +1 -1
  19. package/dist/calibration.d.ts +1 -0
  20. package/dist/calibration.d.ts.map +1 -1
  21. package/dist/calibration.js +1 -0
  22. package/dist/calibration.js.map +1 -1
  23. package/dist/composite.d.ts +68 -0
  24. package/dist/composite.d.ts.map +1 -0
  25. package/dist/composite.js +94 -0
  26. package/dist/composite.js.map +1 -0
  27. package/dist/contract-freshness.d.ts +74 -0
  28. package/dist/contract-freshness.d.ts.map +1 -0
  29. package/dist/contract-freshness.js +290 -0
  30. package/dist/contract-freshness.js.map +1 -0
  31. package/dist/coverage-facts.d.ts +43 -0
  32. package/dist/coverage-facts.d.ts.map +1 -0
  33. package/dist/coverage-facts.js +82 -0
  34. package/dist/coverage-facts.js.map +1 -0
  35. package/dist/coverage-istanbul.d.ts +3 -0
  36. package/dist/coverage-istanbul.d.ts.map +1 -0
  37. package/dist/coverage-istanbul.js +20 -0
  38. package/dist/coverage-istanbul.js.map +1 -0
  39. package/dist/coverage-lcov.d.ts +7 -0
  40. package/dist/coverage-lcov.d.ts.map +1 -0
  41. package/dist/coverage-lcov.js +91 -0
  42. package/dist/coverage-lcov.js.map +1 -0
  43. package/dist/domain-construction.d.ts +139 -0
  44. package/dist/domain-construction.d.ts.map +1 -0
  45. package/dist/domain-construction.js +314 -0
  46. package/dist/domain-construction.js.map +1 -0
  47. package/dist/glossary.d.ts +5 -5
  48. package/dist/observer-json.d.ts +1 -0
  49. package/dist/observer-json.d.ts.map +1 -1
  50. package/dist/observer-json.js +1 -0
  51. package/dist/observer-json.js.map +1 -1
  52. package/dist/presets.d.ts +4 -0
  53. package/dist/presets.d.ts.map +1 -1
  54. package/dist/presets.js +27 -1
  55. package/dist/presets.js.map +1 -1
  56. package/dist/reference-data-loader.d.ts.map +1 -1
  57. package/dist/reference-data-loader.js +51 -0
  58. package/dist/reference-data-loader.js.map +1 -1
  59. package/dist/reference-data.d.ts +8 -0
  60. package/dist/reference-data.d.ts.map +1 -1
  61. package/dist/reference-data.js +4 -0
  62. package/dist/reference-data.js.map +1 -1
  63. package/dist/registry.js +1 -3
  64. package/dist/registry.js.map +1 -1
  65. package/dist/scoring-engine-contract.d.ts.map +1 -1
  66. package/dist/scoring-engine-contract.js +29 -7
  67. package/dist/scoring-engine-contract.js.map +1 -1
  68. package/dist/scoring-engine-git-paths.d.ts.map +1 -1
  69. package/dist/scoring-engine-git-paths.js +6 -1
  70. package/dist/scoring-engine-git-paths.js.map +1 -1
  71. package/dist/scoring-engine-observer-cache.d.ts.map +1 -1
  72. package/dist/scoring-engine-observer-cache.js +37 -0
  73. package/dist/scoring-engine-observer-cache.js.map +1 -1
  74. package/dist/scoring-engine-runtime.d.ts.map +1 -1
  75. package/dist/scoring-engine-runtime.js +2 -6
  76. package/dist/scoring-engine-runtime.js.map +1 -1
  77. package/dist/scoring-engine-score-execution.d.ts.map +1 -1
  78. package/dist/scoring-engine-score-execution.js +23 -3
  79. package/dist/scoring-engine-score-execution.js.map +1 -1
  80. package/dist/shared-churn-02.d.ts +33 -0
  81. package/dist/shared-churn-02.d.ts.map +1 -0
  82. package/dist/shared-churn-02.js +110 -0
  83. package/dist/shared-churn-02.js.map +1 -0
  84. package/dist/shared-cochange-01.d.ts +38 -0
  85. package/dist/shared-cochange-01.d.ts.map +1 -0
  86. package/dist/shared-cochange-01.js +148 -0
  87. package/dist/shared-cochange-01.js.map +1 -0
  88. package/dist/shared-history-commits.d.ts +8 -0
  89. package/dist/shared-history-commits.d.ts.map +1 -0
  90. package/dist/shared-history-commits.js +52 -0
  91. package/dist/shared-history-commits.js.map +1 -0
  92. package/dist/shared-signals.d.ts +2 -0
  93. package/dist/shared-signals.d.ts.map +1 -1
  94. package/dist/shared-signals.js +2 -0
  95. package/dist/shared-signals.js.map +1 -1
  96. package/dist/signal-api.d.ts +4 -1
  97. package/dist/signal-api.d.ts.map +1 -1
  98. package/dist/signal-api.js +2 -0
  99. package/dist/signal-api.js.map +1 -1
  100. package/dist/signal.d.ts +7 -0
  101. package/dist/signal.d.ts.map +1 -1
  102. package/dist/time-series-model.d.ts +1 -0
  103. package/dist/time-series-model.d.ts.map +1 -1
  104. package/dist/vector-schema.d.ts +36 -16
  105. package/dist/vector-schema.d.ts.map +1 -1
  106. package/dist/vector-schema.js +8 -0
  107. package/dist/vector-schema.js.map +1 -1
  108. package/package.json +5 -1
  109. package/presets/ai-slop-defense.json +6 -1
  110. package/presets/domain-purist.json +6 -1
  111. package/presets/refactor-friendly.json +6 -1
  112. package/presets/security-paranoid.json +6 -1
  113. package/presets/strict-type-safety.json +6 -1
  114. package/presets/velocity-first.json +6 -1
@@ -0,0 +1,290 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { readFile, readdir } from "node:fs/promises";
4
+ import { isAbsolute, join, relative, resolve } from "node:path";
5
+ import { Schema } from "effect";
6
+ export const CONTRACT_FRESHNESS_REFERENCE_DATA_KEY = "contract-freshness";
7
+ export const CANONICAL_CONTRACT_FRESHNESS_RELATIVE_PATH = ".pulsar/contract-freshness.json";
8
+ const ContractFreshnessContract = Schema.Struct({
9
+ id: Schema.String,
10
+ group_id: Schema.optional(Schema.String),
11
+ source_paths: Schema.Array(Schema.String),
12
+ artifact_path: Schema.String,
13
+ source_hashes: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.String })),
14
+ artifact_sha256: Schema.optional(Schema.String),
15
+ generator: Schema.optional(Schema.String),
16
+ provenance_path: Schema.optional(Schema.String),
17
+ });
18
+ export const ContractFreshnessManifest = Schema.Struct({
19
+ schema_version: Schema.Literal(1),
20
+ generated_artifact_globs: Schema.optional(Schema.Array(Schema.String)),
21
+ exclude_globs: Schema.optional(Schema.Array(Schema.String)),
22
+ contracts: Schema.Array(ContractFreshnessContract),
23
+ });
24
+ const DEFAULT_EXCLUDE_GLOBS = [
25
+ "**/.git/**",
26
+ "**/node_modules/**",
27
+ "**/dist/**",
28
+ "**/build/**",
29
+ "**/coverage/**",
30
+ "**/.turbo/**",
31
+ "**/target/**",
32
+ "**/vendor/**",
33
+ "**/fixtures/**",
34
+ ];
35
+ const FINDING_WEIGHT = {
36
+ "missing-provenance": 2,
37
+ "stale-artifact": 5,
38
+ "missing-generated-artifact": 4,
39
+ "orphan-generated-artifact": 3,
40
+ };
41
+ export const decodeContractFreshnessManifestSync = Schema.decodeUnknownSync(ContractFreshnessManifest);
42
+ export const loadContractFreshnessFacts = async (repoRoot) => {
43
+ const checkedPaths = [CANONICAL_CONTRACT_FRESHNESS_RELATIVE_PATH];
44
+ const sourcePath = join(repoRoot, CANONICAL_CONTRACT_FRESHNESS_RELATIVE_PATH);
45
+ if (!existsSync(sourcePath))
46
+ return buildNotConfiguredContractFreshnessFacts(checkedPaths);
47
+ try {
48
+ const raw = await readFile(sourcePath, "utf8");
49
+ const parsed = JSON.parse(raw);
50
+ const manifest = decodeContractFreshnessManifestSync(parsed);
51
+ return await collectContractFreshnessFacts(repoRoot, sourcePath, checkedPaths, manifest);
52
+ }
53
+ catch (cause) {
54
+ return buildUnknownContractFreshnessFacts(checkedPaths, `Failed to load contract freshness reference data: ${String(cause)}`, sourcePath);
55
+ }
56
+ };
57
+ export const buildNotConfiguredContractFreshnessFacts = (checkedPaths) => ({
58
+ state: "not_configured",
59
+ checkedPaths,
60
+ contracts: [],
61
+ findings: [],
62
+ sourceFingerprint: fingerprint({ checkedPaths, state: "not_configured" }),
63
+ message: "Contract freshness reference data was not configured",
64
+ });
65
+ export const buildUnknownContractFreshnessFacts = (checkedPaths, message, sourcePath) => ({
66
+ state: "unknown",
67
+ ...(sourcePath === undefined ? {} : { sourcePath }),
68
+ checkedPaths,
69
+ contracts: [],
70
+ findings: [],
71
+ sourceFingerprint: fingerprint({ checkedPaths, message, state: "unknown" }),
72
+ message,
73
+ });
74
+ const collectContractFreshnessFacts = async (repoRoot, sourcePath, checkedPaths, manifest) => {
75
+ const contracts = [];
76
+ const findings = [];
77
+ const checkedPathSet = new Set(checkedPaths);
78
+ const declaredArtifacts = new Set(manifest.contracts.map((contract) => normalizePath(contract.artifact_path)));
79
+ for (const contract of manifest.contracts) {
80
+ const groupId = contract.group_id ?? "default";
81
+ const expectedSourceHashes = normalizeHashRecord(contract.source_hashes ?? {});
82
+ const normalizedSourcePaths = contract.source_paths.map(normalizePath);
83
+ for (const source of normalizedSourcePaths)
84
+ checkedPathSet.add(source);
85
+ const artifactPath = normalizePath(contract.artifact_path);
86
+ checkedPathSet.add(artifactPath);
87
+ const sourceHashes = await currentSourceHashes(repoRoot, normalizedSourcePaths);
88
+ const artifactAbsolutePath = safeResolve(repoRoot, artifactPath);
89
+ const artifactExists = artifactAbsolutePath !== undefined && existsSync(artifactAbsolutePath);
90
+ const artifactHash = artifactExists ? await fileHash(artifactAbsolutePath) : undefined;
91
+ contracts.push({
92
+ contractId: contract.id,
93
+ groupId,
94
+ artifactPath,
95
+ sourcePaths: normalizedSourcePaths,
96
+ sourceHashes,
97
+ expectedSourceHashes,
98
+ ...(artifactHash === undefined ? {} : { artifactHash }),
99
+ ...(contract.artifact_sha256 === undefined ? {} : { expectedArtifactHash: contract.artifact_sha256.toLowerCase() }),
100
+ ...(contract.generator === undefined ? {} : { generator: contract.generator }),
101
+ });
102
+ if (!artifactExists) {
103
+ findings.push(makeFinding({
104
+ contractId: contract.id,
105
+ groupId,
106
+ kind: "missing-generated-artifact",
107
+ file: artifactPath,
108
+ artifactFile: artifactPath,
109
+ evidence: ["declared generated artifact is missing"],
110
+ }));
111
+ continue;
112
+ }
113
+ if (Object.keys(expectedSourceHashes).length === 0 && contract.artifact_sha256 === undefined) {
114
+ findings.push(makeFinding({
115
+ contractId: contract.id,
116
+ groupId,
117
+ kind: "missing-provenance",
118
+ file: artifactPath,
119
+ artifactFile: artifactPath,
120
+ evidence: ["declared generated artifact has no recorded source or artifact hash provenance"],
121
+ }));
122
+ }
123
+ for (const source of normalizedSourcePaths) {
124
+ if (sourceHashes[source] !== undefined)
125
+ continue;
126
+ findings.push(makeFinding({
127
+ contractId: contract.id,
128
+ groupId,
129
+ kind: "stale-artifact",
130
+ file: artifactPath,
131
+ sourceFile: source,
132
+ artifactFile: artifactPath,
133
+ evidence: ["declared source contract is missing"],
134
+ }));
135
+ }
136
+ for (const [source, expectedHash] of Object.entries(expectedSourceHashes)) {
137
+ const actualHash = sourceHashes[source];
138
+ if (actualHash !== undefined && actualHash !== expectedHash) {
139
+ findings.push(makeFinding({
140
+ contractId: contract.id,
141
+ groupId,
142
+ kind: "stale-artifact",
143
+ file: artifactPath,
144
+ sourceFile: source,
145
+ artifactFile: artifactPath,
146
+ evidence: [
147
+ `expected source hash ${expectedHash}`,
148
+ `current source hash ${actualHash}`,
149
+ ],
150
+ }));
151
+ }
152
+ }
153
+ if (contract.artifact_sha256 !== undefined &&
154
+ artifactHash !== undefined &&
155
+ artifactHash !== contract.artifact_sha256.toLowerCase()) {
156
+ findings.push(makeFinding({
157
+ contractId: contract.id,
158
+ groupId,
159
+ kind: "stale-artifact",
160
+ file: artifactPath,
161
+ artifactFile: artifactPath,
162
+ evidence: [
163
+ `expected artifact hash ${contract.artifact_sha256.toLowerCase()}`,
164
+ `current artifact hash ${artifactHash}`,
165
+ ],
166
+ }));
167
+ }
168
+ }
169
+ const orphanArtifacts = await collectOrphanArtifacts(repoRoot, manifest.generated_artifact_globs ?? [], [...DEFAULT_EXCLUDE_GLOBS, ...(manifest.exclude_globs ?? [])], declaredArtifacts);
170
+ for (const artifact of orphanArtifacts)
171
+ checkedPathSet.add(artifact);
172
+ findings.push(...orphanArtifacts.map((artifact) => makeFinding({
173
+ contractId: artifact,
174
+ groupId: "detected",
175
+ kind: "orphan-generated-artifact",
176
+ file: artifact,
177
+ artifactFile: artifact,
178
+ evidence: ["generated artifact matched contract freshness globs but is not declared in provenance data"],
179
+ })));
180
+ findings.sort(compareFindings);
181
+ const state = findings.length > 0 ? "present" : "zero";
182
+ return {
183
+ state,
184
+ sourcePath,
185
+ checkedPaths: [...checkedPathSet].sort(),
186
+ contracts,
187
+ findings,
188
+ sourceFingerprint: fingerprint({ contracts, findings, manifest, state }),
189
+ };
190
+ };
191
+ const currentSourceHashes = async (repoRoot, sourcePaths) => {
192
+ const result = {};
193
+ for (const sourcePath of sourcePaths.map(normalizePath)) {
194
+ const absolutePath = safeResolve(repoRoot, sourcePath);
195
+ if (absolutePath === undefined || !existsSync(absolutePath))
196
+ continue;
197
+ result[sourcePath] = await fileHash(absolutePath);
198
+ }
199
+ return result;
200
+ };
201
+ const collectOrphanArtifacts = async (repoRoot, artifactGlobs, excludeGlobs, declaredArtifacts) => {
202
+ if (artifactGlobs.length === 0)
203
+ return [];
204
+ const files = await listFiles(repoRoot, excludeGlobs);
205
+ return files
206
+ .filter((path) => matchesAnyGlob(path, artifactGlobs))
207
+ .filter((path) => !declaredArtifacts.has(path))
208
+ .sort();
209
+ };
210
+ const listFiles = async (root, excludeGlobs) => {
211
+ const files = [];
212
+ const visit = async (dir) => {
213
+ const entries = await readdir(dir, { withFileTypes: true });
214
+ for (const entry of entries) {
215
+ const absolutePath = resolve(dir, entry.name);
216
+ const path = normalizePath(relative(root, absolutePath));
217
+ if (path === "" || matchesAnyGlob(path, excludeGlobs))
218
+ continue;
219
+ if (entry.isDirectory()) {
220
+ await visit(absolutePath);
221
+ }
222
+ else if (entry.isFile()) {
223
+ files.push(path);
224
+ }
225
+ }
226
+ };
227
+ await visit(root);
228
+ return files;
229
+ };
230
+ const makeFinding = (args) => ({
231
+ findingId: `${args.contractId}:${args.kind}:${args.file}`,
232
+ contractId: args.contractId,
233
+ groupId: args.groupId,
234
+ kind: args.kind,
235
+ file: args.file,
236
+ ...(args.sourceFile === undefined ? {} : { sourceFile: args.sourceFile }),
237
+ ...(args.artifactFile === undefined ? {} : { artifactFile: args.artifactFile }),
238
+ severity: args.kind === "missing-provenance" ? "info" : "warn",
239
+ weight: FINDING_WEIGHT[args.kind],
240
+ evidence: args.evidence,
241
+ });
242
+ const normalizeHashRecord = (record) => Object.fromEntries(Object.entries(record).map(([path, hash]) => [normalizePath(path), hash.toLowerCase()]));
243
+ const safeResolve = (repoRoot, path) => {
244
+ const root = resolve(repoRoot);
245
+ const resolved = resolve(root, path);
246
+ const rel = relative(root, resolved);
247
+ return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel))
248
+ ? resolved
249
+ : undefined;
250
+ };
251
+ const fileHash = async (path) => sha256(await readFile(path));
252
+ const sha256 = (content) => createHash("sha256").update(content).digest("hex");
253
+ const fingerprint = (value) => sha256(stableStringify(value));
254
+ const stableStringify = (value) => JSON.stringify(sortJson(value));
255
+ const sortJson = (value) => {
256
+ if (Array.isArray(value))
257
+ return value.map(sortJson);
258
+ if (value !== null && typeof value === "object") {
259
+ return Object.fromEntries(Object.entries(value)
260
+ .sort(([left], [right]) => left.localeCompare(right))
261
+ .map(([key, nested]) => [key, sortJson(nested)]));
262
+ }
263
+ return value;
264
+ };
265
+ const matchesAnyGlob = (path, globs) => globs.some((glob) => globMatches(path, glob));
266
+ const globMatches = (path, glob) => globToRegex(glob).test(normalizePath(path));
267
+ const globToRegex = (glob) => {
268
+ const escaped = normalizePath(glob)
269
+ .replace(/[.+^${}()|[\]\\]/gu, "\\$&")
270
+ .replace(/\*\*/gu, "<<<GLOBSTAR>>>")
271
+ .replace(/\*/gu, "[^/]*")
272
+ .replace(/<<<GLOBSTAR>>>/gu, ".*");
273
+ return new RegExp(`^${escaped}$`, "u");
274
+ };
275
+ const normalizePath = (path) => path.replace(/\\/gu, "/");
276
+ const compareFindings = (left, right) => {
277
+ const bySeverity = severityRank(right.severity) - severityRank(left.severity);
278
+ if (bySeverity !== 0)
279
+ return bySeverity;
280
+ const byWeight = right.weight - left.weight;
281
+ if (byWeight !== 0)
282
+ return byWeight;
283
+ if (left.groupId !== right.groupId)
284
+ return left.groupId.localeCompare(right.groupId);
285
+ if (left.file !== right.file)
286
+ return left.file.localeCompare(right.file);
287
+ return left.kind.localeCompare(right.kind);
288
+ };
289
+ const severityRank = (severity) => severity === "warn" ? 1 : 0;
290
+ //# sourceMappingURL=contract-freshness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-freshness.js","sourceRoot":"","sources":["../src/contract-freshness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { Schema } from "effect";
2
+ export declare const COVERAGE_REFERENCE_DATA_KEY: "coverage";
3
+ export declare const CANONICAL_LCOV_RELATIVE_PATH: "coverage/lcov.info";
4
+ export declare const CANONICAL_ISTANBUL_RELATIVE_PATH: "coverage/coverage-final.json";
5
+ export declare const CoverageFactState: Schema.Literal<["present", "zero", "absent", "unknown", "not_configured", "not_applicable"]>;
6
+ export type CoverageFactState = typeof CoverageFactState.Type;
7
+ export interface CoverageMetric {
8
+ readonly covered: number;
9
+ readonly total: number;
10
+ readonly pct: number;
11
+ }
12
+ export interface CoverageFileFact {
13
+ readonly file: string;
14
+ readonly lines: CoverageMetric;
15
+ readonly functions: CoverageMetric;
16
+ readonly branches: CoverageMetric;
17
+ }
18
+ export interface CoverageFacts {
19
+ readonly state: CoverageFactState;
20
+ readonly tool?: "lcov" | "istanbul";
21
+ readonly sourcePath?: string;
22
+ readonly checkedPaths: ReadonlyArray<string>;
23
+ readonly files: ReadonlyArray<CoverageFileFact>;
24
+ readonly summary: {
25
+ readonly lines: CoverageMetric;
26
+ readonly functions: CoverageMetric;
27
+ readonly branches: CoverageMetric;
28
+ };
29
+ readonly message?: string;
30
+ }
31
+ export interface CoverageCandidate {
32
+ readonly relativePath: string;
33
+ readonly content: string;
34
+ }
35
+ export declare const emptyCoverageMetric: () => CoverageMetric;
36
+ export declare const coverageMetric: (covered: number, total: number) => CoverageMetric;
37
+ export declare const summarizeCoverageFiles: (files: ReadonlyArray<CoverageFileFact>) => CoverageFacts["summary"];
38
+ export declare const determineCoverageState: (summary: CoverageFacts["summary"], files: ReadonlyArray<CoverageFileFact>) => CoverageFactState;
39
+ export declare const buildAbsentCoverageFacts: (checkedPaths: ReadonlyArray<string>) => CoverageFacts;
40
+ export declare const buildUnknownCoverageFacts: (checkedPaths: ReadonlyArray<string>, message: string, sourcePath?: string) => CoverageFacts;
41
+ export declare const parseCoverageCandidate: (repoRoot: string, candidate: CoverageCandidate, checkedPaths: ReadonlyArray<string>) => CoverageFacts;
42
+ export declare const resolveCoveragePath: (repoRoot: string, path: string) => string;
43
+ //# sourceMappingURL=coverage-facts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-facts.d.ts","sourceRoot":"","sources":["../src/coverage-facts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAI/B,eAAO,MAAM,2BAA2B,EAAG,UAAmB,CAAA;AAC9D,eAAO,MAAM,4BAA4B,EAAG,oBAA6B,CAAA;AACzE,eAAO,MAAM,gCAAgC,EAAG,8BAAuC,CAAA;AAEvF,eAAO,MAAM,iBAAiB,8FAO7B,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAE7D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAA;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;IAC/C,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;QAC9B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;QAClC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;KAClC,CAAA;IACD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,eAAO,MAAM,mBAAmB,QAAO,cAIrC,CAAA;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,cAI9D,CAAA;AAEF,eAAO,MAAM,sBAAsB,GACjC,OAAO,aAAa,CAAC,gBAAgB,CAAC,KACrC,aAAa,CAAC,SAAS,CAWzB,CAAA;AAED,eAAO,MAAM,sBAAsB,GACjC,SAAS,aAAa,CAAC,SAAS,CAAC,EACjC,OAAO,aAAa,CAAC,gBAAgB,CAAC,KACrC,iBAQF,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,cAAc,aAAa,CAAC,MAAM,CAAC,KAClC,aAUD,CAAA;AAEF,eAAO,MAAM,yBAAyB,GACpC,cAAc,aAAa,CAAC,MAAM,CAAC,EACnC,SAAS,MAAM,EACf,aAAa,MAAM,KAClB,aAWD,CAAA;AAEF,eAAO,MAAM,sBAAsB,GACjC,UAAU,MAAM,EAChB,WAAW,iBAAiB,EAC5B,cAAc,aAAa,CAAC,MAAM,CAAC,KAClC,aAkBF,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,EAAE,MAAM,MAAM,KAAG,MACN,CAAA"}
@@ -0,0 +1,82 @@
1
+ import { join, normalize } from "node:path";
2
+ import { Schema } from "effect";
3
+ import { parseIstanbulCoverage } from "./coverage-istanbul.js";
4
+ import { parseLcovCoverage } from "./coverage-lcov.js";
5
+ export const COVERAGE_REFERENCE_DATA_KEY = "coverage";
6
+ export const CANONICAL_LCOV_RELATIVE_PATH = "coverage/lcov.info";
7
+ export const CANONICAL_ISTANBUL_RELATIVE_PATH = "coverage/coverage-final.json";
8
+ export const CoverageFactState = Schema.Literal("present", "zero", "absent", "unknown", "not_configured", "not_applicable");
9
+ export const emptyCoverageMetric = () => ({
10
+ covered: 0,
11
+ total: 0,
12
+ pct: 1,
13
+ });
14
+ export const coverageMetric = (covered, total) => ({
15
+ covered,
16
+ total,
17
+ pct: total === 0 ? 1 : covered / total,
18
+ });
19
+ export const summarizeCoverageFiles = (files) => {
20
+ const sum = (select) => {
21
+ const covered = files.reduce((total, file) => total + select(file).covered, 0);
22
+ const denominator = files.reduce((total, file) => total + select(file).total, 0);
23
+ return coverageMetric(covered, denominator);
24
+ };
25
+ return {
26
+ lines: sum((file) => file.lines),
27
+ functions: sum((file) => file.functions),
28
+ branches: sum((file) => file.branches),
29
+ };
30
+ };
31
+ export const determineCoverageState = (summary, files) => {
32
+ const denominator = summary.lines.total + summary.functions.total + summary.branches.total;
33
+ const covered = summary.lines.covered + summary.functions.covered + summary.branches.covered;
34
+ if (files.length === 0 || denominator === 0)
35
+ return "zero";
36
+ if (covered === 0)
37
+ return "zero";
38
+ return "present";
39
+ };
40
+ export const buildAbsentCoverageFacts = (checkedPaths) => ({
41
+ state: "absent",
42
+ checkedPaths,
43
+ files: [],
44
+ summary: {
45
+ lines: emptyCoverageMetric(),
46
+ functions: emptyCoverageMetric(),
47
+ branches: emptyCoverageMetric(),
48
+ },
49
+ message: "No supported coverage report found",
50
+ });
51
+ export const buildUnknownCoverageFacts = (checkedPaths, message, sourcePath) => ({
52
+ state: "unknown",
53
+ ...(sourcePath !== undefined ? { sourcePath } : {}),
54
+ checkedPaths,
55
+ files: [],
56
+ summary: {
57
+ lines: emptyCoverageMetric(),
58
+ functions: emptyCoverageMetric(),
59
+ branches: emptyCoverageMetric(),
60
+ },
61
+ message,
62
+ });
63
+ export const parseCoverageCandidate = (repoRoot, candidate, checkedPaths) => {
64
+ const sourcePath = join(repoRoot, candidate.relativePath);
65
+ const extension = candidate.relativePath.endsWith(".json") ? "json" : "lcov";
66
+ const parsed = extension === "json"
67
+ ? parseIstanbulCoverage(repoRoot, candidate.content)
68
+ : parseLcovCoverage(repoRoot, candidate.content);
69
+ const summary = summarizeCoverageFiles(parsed.files);
70
+ const state = determineCoverageState(summary, parsed.files);
71
+ return {
72
+ state,
73
+ tool: parsed.tool,
74
+ sourcePath,
75
+ checkedPaths,
76
+ files: parsed.files,
77
+ summary,
78
+ ...(state === "zero" ? { message: "Coverage report contains zero covered items" } : {}),
79
+ };
80
+ };
81
+ export const resolveCoveragePath = (repoRoot, path) => normalize(path.startsWith("/") ? path : join(repoRoot, path));
82
+ //# sourceMappingURL=coverage-facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-facts.js","sourceRoot":"","sources":["../src/coverage-facts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ParsedCoverage } from "./coverage-lcov.js";
2
+ export declare const parseIstanbulCoverage: (repoRoot: string, content: string) => ParsedCoverage;
3
+ //# sourceMappingURL=coverage-istanbul.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-istanbul.d.ts","sourceRoot":"","sources":["../src/coverage-istanbul.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AASxD,eAAO,MAAM,qBAAqB,GAChC,UAAU,MAAM,EAChB,SAAS,MAAM,KACd,cA2BF,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { coverageMetric, resolveCoveragePath } from "./coverage-facts.js";
2
+ export const parseIstanbulCoverage = (repoRoot, content) => {
3
+ const parsed = JSON.parse(content);
4
+ const files = [];
5
+ for (const [key, value] of Object.entries(parsed)) {
6
+ if (value === null || typeof value !== "object")
7
+ continue;
8
+ const statementHits = Object.values(value.s ?? {});
9
+ const functionHits = Object.values(value.f ?? {});
10
+ const branchHits = Object.values(value.b ?? {}).flat();
11
+ files.push({
12
+ file: resolveCoveragePath(repoRoot, value.path ?? key),
13
+ lines: coverageMetric(statementHits.filter((hitCount) => hitCount > 0).length, statementHits.length),
14
+ functions: coverageMetric(functionHits.filter((hitCount) => hitCount > 0).length, functionHits.length),
15
+ branches: coverageMetric(branchHits.filter((hitCount) => hitCount > 0).length, branchHits.length),
16
+ });
17
+ }
18
+ return { tool: "istanbul", files };
19
+ };
20
+ //# sourceMappingURL=coverage-istanbul.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-istanbul.js","sourceRoot":"","sources":["../src/coverage-istanbul.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAUzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAAgB,EAChB,OAAe,EACC,EAAE;IAClB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAyC,CAAA;IAC1E,MAAM,KAAK,GAA4B,EAAE,CAAA;IAEzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAQ;QACzD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAClD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACjD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACtD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;YACtD,KAAK,EAAE,cAAc,CACnB,aAAa,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,EACvD,aAAa,CAAC,MAAM,CACrB;YACD,SAAS,EAAE,cAAc,CACvB,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,EACtD,YAAY,CAAC,MAAM,CACpB;YACD,QAAQ,EAAE,cAAc,CACtB,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,EACpD,UAAU,CAAC,MAAM,CAClB;SACF,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;AACpC,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { CoverageFileFact } from "./coverage-facts.js";
2
+ export interface ParsedCoverage {
3
+ readonly tool: "lcov" | "istanbul";
4
+ readonly files: ReadonlyArray<CoverageFileFact>;
5
+ }
6
+ export declare const parseLcovCoverage: (repoRoot: string, content: string) => ParsedCoverage;
7
+ //# sourceMappingURL=coverage-lcov.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-lcov.d.ts","sourceRoot":"","sources":["../src/coverage-lcov.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAG3D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;IAClC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;CAChD;AAYD,eAAO,MAAM,iBAAiB,GAC5B,UAAU,MAAM,EAChB,SAAS,MAAM,KACd,cA+EF,CAAA"}
@@ -0,0 +1,91 @@
1
+ import { coverageMetric, resolveCoveragePath } from "./coverage-facts.js";
2
+ export const parseLcovCoverage = (repoRoot, content) => {
3
+ const records = [];
4
+ let current = emptyRecord();
5
+ const flush = () => {
6
+ if (current.file === undefined) {
7
+ current = emptyRecord();
8
+ return;
9
+ }
10
+ records.push({
11
+ file: resolveCoveragePath(repoRoot, current.file),
12
+ lines: coverageMetric(current.linesHit, current.linesFound),
13
+ functions: coverageMetric(current.functionsHit, current.functionsFound),
14
+ branches: coverageMetric(current.branchesHit, current.branchesFound),
15
+ });
16
+ current = emptyRecord();
17
+ };
18
+ for (const rawLine of content.split(/\r?\n/u)) {
19
+ const line = rawLine.trim();
20
+ if (line.length === 0)
21
+ continue;
22
+ if (line.startsWith("SF:")) {
23
+ current.file = line.slice("SF:".length);
24
+ continue;
25
+ }
26
+ if (line.startsWith("DA:")) {
27
+ current.linesFound += 1;
28
+ const [, hitCount] = line.slice("DA:".length).split(",");
29
+ if (Number.parseInt(hitCount ?? "0", 10) > 0)
30
+ current.linesHit += 1;
31
+ continue;
32
+ }
33
+ if (line.startsWith("FNDA:")) {
34
+ current.functionsFound += 1;
35
+ const [hitCount] = line.slice("FNDA:".length).split(",");
36
+ if (Number.parseInt(hitCount ?? "0", 10) > 0)
37
+ current.functionsHit += 1;
38
+ continue;
39
+ }
40
+ if (line.startsWith("BRDA:")) {
41
+ current.branchesFound += 1;
42
+ const parts = line.slice("BRDA:".length).split(",");
43
+ const hitCount = parts[3];
44
+ if (hitCount !== undefined && hitCount !== "-" && Number.parseInt(hitCount, 10) > 0) {
45
+ current.branchesHit += 1;
46
+ }
47
+ continue;
48
+ }
49
+ if (line.startsWith("LF:")) {
50
+ current.linesFound = Number.parseInt(line.slice("LF:".length), 10) || current.linesFound;
51
+ continue;
52
+ }
53
+ if (line.startsWith("LH:")) {
54
+ current.linesHit = Number.parseInt(line.slice("LH:".length), 10) || current.linesHit;
55
+ continue;
56
+ }
57
+ if (line.startsWith("FNF:")) {
58
+ current.functionsFound =
59
+ Number.parseInt(line.slice("FNF:".length), 10) || current.functionsFound;
60
+ continue;
61
+ }
62
+ if (line.startsWith("FNH:")) {
63
+ current.functionsHit =
64
+ Number.parseInt(line.slice("FNH:".length), 10) || current.functionsHit;
65
+ continue;
66
+ }
67
+ if (line.startsWith("BRF:")) {
68
+ current.branchesFound =
69
+ Number.parseInt(line.slice("BRF:".length), 10) || current.branchesFound;
70
+ continue;
71
+ }
72
+ if (line.startsWith("BRH:")) {
73
+ current.branchesHit =
74
+ Number.parseInt(line.slice("BRH:".length), 10) || current.branchesHit;
75
+ continue;
76
+ }
77
+ if (line === "end_of_record")
78
+ flush();
79
+ }
80
+ flush();
81
+ return { tool: "lcov", files: records };
82
+ };
83
+ const emptyRecord = () => ({
84
+ linesFound: 0,
85
+ linesHit: 0,
86
+ functionsFound: 0,
87
+ functionsHit: 0,
88
+ branchesFound: 0,
89
+ branchesHit: 0,
90
+ });
91
+ //# sourceMappingURL=coverage-lcov.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-lcov.js","sourceRoot":"","sources":["../src/coverage-lcov.ts"],"names":[],"mappings":"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"}