patchdrill 0.1.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 (169) hide show
  1. package/.patchdrill.yml +33 -0
  2. package/CHANGELOG.md +150 -0
  3. package/CONTRIBUTING.md +59 -0
  4. package/LICENSE +21 -0
  5. package/README.md +601 -0
  6. package/SECURITY.md +28 -0
  7. package/action.yml +338 -0
  8. package/dist/baseline.d.ts +9 -0
  9. package/dist/baseline.js +38 -0
  10. package/dist/baseline.js.map +1 -0
  11. package/dist/cli.d.ts +19 -0
  12. package/dist/cli.js +662 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/codeowners.d.ts +14 -0
  15. package/dist/codeowners.js +104 -0
  16. package/dist/codeowners.js.map +1 -0
  17. package/dist/command-plan.d.ts +3 -0
  18. package/dist/command-plan.js +26 -0
  19. package/dist/command-plan.js.map +1 -0
  20. package/dist/demo.d.ts +5 -0
  21. package/dist/demo.js +525 -0
  22. package/dist/demo.js.map +1 -0
  23. package/dist/dependency.d.ts +4 -0
  24. package/dist/dependency.js +1424 -0
  25. package/dist/dependency.js.map +1 -0
  26. package/dist/doctor.d.ts +26 -0
  27. package/dist/doctor.js +183 -0
  28. package/dist/doctor.js.map +1 -0
  29. package/dist/evidence.d.ts +64 -0
  30. package/dist/evidence.js +352 -0
  31. package/dist/evidence.js.map +1 -0
  32. package/dist/git.d.ts +16 -0
  33. package/dist/git.js +349 -0
  34. package/dist/git.js.map +1 -0
  35. package/dist/i18n-catalog.d.ts +8 -0
  36. package/dist/i18n-catalog.js +446 -0
  37. package/dist/i18n-catalog.js.map +1 -0
  38. package/dist/i18n.d.ts +20 -0
  39. package/dist/i18n.js +67 -0
  40. package/dist/i18n.js.map +1 -0
  41. package/dist/init.d.ts +13 -0
  42. package/dist/init.js +312 -0
  43. package/dist/init.js.map +1 -0
  44. package/dist/markdown-links.d.ts +18 -0
  45. package/dist/markdown-links.js +180 -0
  46. package/dist/markdown-links.js.map +1 -0
  47. package/dist/package-scripts.d.ts +3 -0
  48. package/dist/package-scripts.js +55 -0
  49. package/dist/package-scripts.js.map +1 -0
  50. package/dist/planner.d.ts +8 -0
  51. package/dist/planner.js +2351 -0
  52. package/dist/planner.js.map +1 -0
  53. package/dist/policy.d.ts +12 -0
  54. package/dist/policy.js +255 -0
  55. package/dist/policy.js.map +1 -0
  56. package/dist/project.d.ts +2 -0
  57. package/dist/project.js +1085 -0
  58. package/dist/project.js.map +1 -0
  59. package/dist/release-readiness.d.ts +25 -0
  60. package/dist/release-readiness.js +426 -0
  61. package/dist/release-readiness.js.map +1 -0
  62. package/dist/report-annotations.d.ts +3 -0
  63. package/dist/report-annotations.js +28 -0
  64. package/dist/report-annotations.js.map +1 -0
  65. package/dist/report-contract.d.ts +2 -0
  66. package/dist/report-contract.js +82 -0
  67. package/dist/report-contract.js.map +1 -0
  68. package/dist/report-html.d.ts +7 -0
  69. package/dist/report-html.js +706 -0
  70. package/dist/report-html.js.map +1 -0
  71. package/dist/report-sarif.d.ts +2 -0
  72. package/dist/report-sarif.js +90 -0
  73. package/dist/report-sarif.js.map +1 -0
  74. package/dist/report.d.ts +14 -0
  75. package/dist/report.js +310 -0
  76. package/dist/report.js.map +1 -0
  77. package/dist/risk.d.ts +19 -0
  78. package/dist/risk.js +1226 -0
  79. package/dist/risk.js.map +1 -0
  80. package/dist/runner.d.ts +8 -0
  81. package/dist/runner.js +113 -0
  82. package/dist/runner.js.map +1 -0
  83. package/dist/scan.d.ts +2 -0
  84. package/dist/scan.js +195 -0
  85. package/dist/scan.js.map +1 -0
  86. package/dist/schema.d.ts +12 -0
  87. package/dist/schema.js +30 -0
  88. package/dist/schema.js.map +1 -0
  89. package/dist/stack-coverage.d.ts +8 -0
  90. package/dist/stack-coverage.js +94 -0
  91. package/dist/stack-coverage.js.map +1 -0
  92. package/dist/types.d.ts +206 -0
  93. package/dist/types.js +2 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/verification.d.ts +11 -0
  96. package/dist/verification.js +108 -0
  97. package/dist/verification.js.map +1 -0
  98. package/docs/ANNOTATIONS.md +34 -0
  99. package/docs/ARCHITECTURE.md +79 -0
  100. package/docs/BASELINES.md +32 -0
  101. package/docs/CASE_STUDIES.md +106 -0
  102. package/docs/CODEOWNERS.md +23 -0
  103. package/docs/DASHBOARD.md +87 -0
  104. package/docs/EVIDENCE.md +55 -0
  105. package/docs/LAUNCH_PLAYBOOK.md +103 -0
  106. package/docs/MONOREPOS.md +74 -0
  107. package/docs/POLICY.md +98 -0
  108. package/docs/PROOF_PACKS.md +57 -0
  109. package/docs/PR_COMMENTS.md +56 -0
  110. package/docs/RELEASE.md +35 -0
  111. package/docs/ROADMAP.md +152 -0
  112. package/docs/RULE_CATALOG.md +90 -0
  113. package/docs/SARIF.md +74 -0
  114. package/docs/SCHEMAS.md +49 -0
  115. package/docs/SECURITY_POSTURE.md +32 -0
  116. package/docs/STACK_COVERAGE.md +20 -0
  117. package/docs/assets/patchdrill-demo.svg +21 -0
  118. package/docs/media/patchdrill-dashboard.png +0 -0
  119. package/docs/media/patchdrill-demo.gif +0 -0
  120. package/examples/case-studies/README.md +20 -0
  121. package/examples/demo/README.md +21 -0
  122. package/examples/demo/patchdrill-demo-summary.md +35 -0
  123. package/examples/demo/patchdrill-demo.html +623 -0
  124. package/examples/demo/patchdrill-demo.json +355 -0
  125. package/examples/demo/patchdrill-demo.md +120 -0
  126. package/examples/demo/patchdrill-demo.sarif +195 -0
  127. package/examples/report.md +128 -0
  128. package/examples/risky-agent-pr/README.md +15 -0
  129. package/examples/risky-agent-pr/patchdrill-demo-summary.md +41 -0
  130. package/examples/risky-agent-pr/patchdrill-demo.html +681 -0
  131. package/examples/risky-agent-pr/patchdrill-demo.json +483 -0
  132. package/examples/risky-agent-pr/patchdrill-demo.md +140 -0
  133. package/examples/risky-agent-pr/patchdrill-demo.sarif +398 -0
  134. package/fixtures/stacks/README.md +4 -0
  135. package/fixtures/stacks/android-gradle/fixture.json +33 -0
  136. package/fixtures/stacks/aspnet-core-service/fixture.json +36 -0
  137. package/fixtures/stacks/bazel-workspace/fixture.json +30 -0
  138. package/fixtures/stacks/buck2-workspace/fixture.json +30 -0
  139. package/fixtures/stacks/cargo-workspace/fixture.json +48 -0
  140. package/fixtures/stacks/django-app/fixture.json +25 -0
  141. package/fixtures/stacks/docker-compose/fixture.json +17 -0
  142. package/fixtures/stacks/dockerfile-service/fixture.json +17 -0
  143. package/fixtures/stacks/dotnet-service/fixture.json +36 -0
  144. package/fixtures/stacks/dotnet-solution-filter/fixture.json +62 -0
  145. package/fixtures/stacks/fastapi-app/fixture.json +29 -0
  146. package/fixtures/stacks/go-workspace/fixture.json +48 -0
  147. package/fixtures/stacks/java-gradle/fixture.json +29 -0
  148. package/fixtures/stacks/java-maven/fixture.json +32 -0
  149. package/fixtures/stacks/kubernetes-helm/fixture.json +25 -0
  150. package/fixtures/stacks/kubernetes-kustomize/fixture.json +21 -0
  151. package/fixtures/stacks/nested-go-workspace/fixture.json +51 -0
  152. package/fixtures/stacks/nextjs-app/fixture.json +34 -0
  153. package/fixtures/stacks/node-turbo-workspace/fixture.json +39 -0
  154. package/fixtures/stacks/pants-python/fixture.json +33 -0
  155. package/fixtures/stacks/php-composer/fixture.json +31 -0
  156. package/fixtures/stacks/python-service/fixture.json +21 -0
  157. package/fixtures/stacks/rails-app/fixture.json +25 -0
  158. package/fixtures/stacks/spring-boot-gradle/fixture.json +29 -0
  159. package/fixtures/stacks/spring-boot-maven/fixture.json +43 -0
  160. package/fixtures/stacks/swift-package/fixture.json +21 -0
  161. package/fixtures/stacks/terraform-module/fixture.json +17 -0
  162. package/fixtures/stacks/uv-python-service/fixture.json +47 -0
  163. package/fixtures/stacks/xcode-app/fixture.json +72 -0
  164. package/package.json +80 -0
  165. package/schemas/patchdrill-doctor.schema.json +171 -0
  166. package/schemas/patchdrill-evidence.schema.json +239 -0
  167. package/schemas/patchdrill-policy.schema.json +170 -0
  168. package/schemas/patchdrill-release-check.schema.json +78 -0
  169. package/schemas/patchdrill-report.schema.json +647 -0
@@ -0,0 +1,352 @@
1
+ import { createHash } from "node:crypto";
2
+ import { Buffer } from "node:buffer";
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { dirname, resolve } from "node:path";
5
+ import { runGit } from "./git.js";
6
+ import { reportContractFailures } from "./report-contract.js";
7
+ export function renderEvidenceManifest(report, artifacts, root, reportJson) {
8
+ const manifest = {
9
+ schemaVersion: "1",
10
+ generatedAt: report.generatedAt,
11
+ tool: {
12
+ name: "patchdrill",
13
+ reportSchemaVersion: report.schemaVersion,
14
+ ...toolVersionField()
15
+ },
16
+ root: report.root,
17
+ ...(report.base ? { base: report.base } : {}),
18
+ ...(report.head ? { head: report.head } : {}),
19
+ git: gitEvidence(root, report),
20
+ summary: report.summary,
21
+ report: {
22
+ ...digest(reportJson),
23
+ findingCount: report.findings.length,
24
+ commandPlanCount: report.commandPlan.length,
25
+ commandResultCount: report.commandResults.length
26
+ },
27
+ artifacts: artifacts.map((artifact) => ({
28
+ kind: artifact.kind,
29
+ path: artifact.path,
30
+ ...digest(artifact.contents)
31
+ })),
32
+ commands: report.commandResults.map(commandEvidence)
33
+ };
34
+ return `${JSON.stringify(manifest, null, 2)}\n`;
35
+ }
36
+ export function verifyEvidenceManifest(path, cwd = process.cwd()) {
37
+ const manifestPath = resolve(cwd, path);
38
+ const manifestDir = dirname(manifestPath);
39
+ const failures = [];
40
+ const warnings = [];
41
+ let checkedArtifactCount = 0;
42
+ let checkedReportArtifact = false;
43
+ let checkedReportContract = false;
44
+ const manifest = readManifest(manifestPath, failures);
45
+ if (!manifest) {
46
+ return { manifestPath, ok: false, checkedArtifactCount, checkedReportArtifact, checkedReportContract, failures, warnings };
47
+ }
48
+ if (manifest.schemaVersion !== "1")
49
+ failures.push("Manifest schemaVersion must be 1.");
50
+ if (manifest.tool?.name !== "patchdrill")
51
+ failures.push("Manifest tool.name must be patchdrill.");
52
+ if (!Array.isArray(manifest.artifacts)) {
53
+ failures.push("Manifest artifacts must be an array.");
54
+ return { manifestPath, ok: false, checkedArtifactCount, checkedReportArtifact, checkedReportContract, failures, warnings };
55
+ }
56
+ const artifactDigests = new Map();
57
+ const artifactKindCounts = new Map();
58
+ const jsonReports = [];
59
+ for (const artifact of manifest.artifacts) {
60
+ if (!isEvidenceArtifact(artifact)) {
61
+ failures.push("Manifest contains an invalid artifact entry.");
62
+ continue;
63
+ }
64
+ artifactKindCounts.set(artifact.kind, (artifactKindCounts.get(artifact.kind) ?? 0) + 1);
65
+ const file = readArtifact(artifact.path, cwd, manifestDir);
66
+ if (!file) {
67
+ failures.push(`Artifact not found: ${artifact.path}`);
68
+ continue;
69
+ }
70
+ checkedArtifactCount += 1;
71
+ const actual = digestBuffer(file.data);
72
+ artifactDigests.set(artifact.kind, actual);
73
+ if (actual.sha256 !== artifact.sha256) {
74
+ failures.push(`Artifact sha256 mismatch: ${artifact.path}`);
75
+ }
76
+ if (actual.bytes !== artifact.bytes) {
77
+ failures.push(`Artifact byte length mismatch: ${artifact.path}`);
78
+ }
79
+ if (artifact.kind === "json") {
80
+ const report = parseReportArtifact(artifact.path, file.data, failures);
81
+ if (report)
82
+ jsonReports.push({ path: artifact.path, report });
83
+ }
84
+ }
85
+ for (const [kind, count] of artifactKindCounts) {
86
+ if (count > 1)
87
+ failures.push(`Manifest records duplicate ${kind} artifacts.`);
88
+ }
89
+ const jsonDigest = artifactDigests.get("json");
90
+ if (!artifactKindCounts.get("json")) {
91
+ // A manifest with no JSON report artifact cannot prove the report digest or
92
+ // contract. Treating this as a pass let a tampered report verify as ok simply
93
+ // by dropping the JSON artifact entry from the manifest.
94
+ failures.push("Manifest records no JSON report artifact; the report digest and report contract cannot be verified.");
95
+ }
96
+ else if (jsonDigest) {
97
+ if (!isDigestLike(manifest.report)) {
98
+ failures.push("Manifest report digest is invalid.");
99
+ }
100
+ else if (jsonDigest.sha256 !== manifest.report.sha256 || jsonDigest.bytes !== manifest.report.bytes) {
101
+ failures.push("Report digest does not match the JSON report artifact.");
102
+ }
103
+ else {
104
+ checkedReportArtifact = true;
105
+ }
106
+ }
107
+ if (jsonReports.length === 1) {
108
+ checkedReportContract = verifyReportContract(manifest, jsonReports[0], failures);
109
+ }
110
+ else if (jsonReports.length > 1) {
111
+ failures.push("Manifest report contract could not be checked because multiple JSON report artifacts were recorded.");
112
+ }
113
+ return {
114
+ manifestPath,
115
+ ok: failures.length === 0,
116
+ checkedArtifactCount,
117
+ checkedReportArtifact,
118
+ checkedReportContract,
119
+ failures,
120
+ warnings
121
+ };
122
+ }
123
+ export function formatEvidenceVerification(result) {
124
+ const lines = [
125
+ `PatchDrill Evidence ${result.ok ? "PASS" : "FAIL"} - verified ${result.checkedArtifactCount} artifact${result.checkedArtifactCount === 1 ? "" : "s"}`
126
+ ];
127
+ lines.push(`Manifest: ${result.manifestPath}`);
128
+ lines.push(`Report JSON digest: ${result.checkedReportArtifact ? "matched" : "not matched"}`);
129
+ lines.push(`Report JSON contract: ${result.checkedReportContract ? "matched" : "not matched"}`);
130
+ for (const warning of result.warnings)
131
+ lines.push(`Warning: ${warning}`);
132
+ for (const failure of result.failures)
133
+ lines.push(`Failure: ${failure}`);
134
+ return lines.join("\n");
135
+ }
136
+ function commandEvidence(result) {
137
+ return {
138
+ id: result.id,
139
+ command: result.command,
140
+ exitCode: result.exitCode,
141
+ durationMs: result.durationMs,
142
+ ...(result.timedOut !== undefined ? { timedOut: result.timedOut } : {}),
143
+ stdout: digest(result.stdout),
144
+ stderr: digest(result.stderr)
145
+ };
146
+ }
147
+ function toolVersionField() {
148
+ const version = readToolVersion();
149
+ return version ? { version } : {};
150
+ }
151
+ function readToolVersion() {
152
+ try {
153
+ const parsed = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
154
+ return typeof parsed.version === "string" ? parsed.version : undefined;
155
+ }
156
+ catch {
157
+ return undefined;
158
+ }
159
+ }
160
+ function gitEvidence(root, report) {
161
+ const branch = safeGit(root, ["rev-parse", "--abbrev-ref", "HEAD"]);
162
+ const headSha = safeGit(root, ["rev-parse", "--verify", report.head ?? "HEAD"]);
163
+ const baseSha = report.base ? safeGit(root, ["rev-parse", "--verify", report.base]) : undefined;
164
+ return {
165
+ ...(branch && branch !== "HEAD" ? { branch } : {}),
166
+ ...(headSha ? { headSha } : {}),
167
+ ...(baseSha ? { baseSha } : {})
168
+ };
169
+ }
170
+ function safeGit(root, args) {
171
+ try {
172
+ const output = runGit(root, args).trim();
173
+ return output.length > 0 ? output : undefined;
174
+ }
175
+ catch {
176
+ return undefined;
177
+ }
178
+ }
179
+ function digest(value) {
180
+ return digestBuffer(Buffer.from(value, "utf8"));
181
+ }
182
+ function digestBuffer(value) {
183
+ return {
184
+ sha256: createHash("sha256").update(value).digest("hex"),
185
+ bytes: value.byteLength
186
+ };
187
+ }
188
+ function readManifest(path, failures) {
189
+ try {
190
+ return JSON.parse(readFileSync(path, "utf8"));
191
+ }
192
+ catch (error) {
193
+ const message = error instanceof Error ? error.message : String(error);
194
+ failures.push(`Failed to read evidence manifest: ${message}`);
195
+ return undefined;
196
+ }
197
+ }
198
+ function parseReportArtifact(path, data, failures) {
199
+ try {
200
+ const value = JSON.parse(data.toString("utf8"));
201
+ if (!isRecord(value)) {
202
+ failures.push(`JSON report artifact is not an object: ${path}`);
203
+ return undefined;
204
+ }
205
+ return value;
206
+ }
207
+ catch (error) {
208
+ const message = error instanceof Error ? error.message : String(error);
209
+ failures.push(`Failed to parse JSON report artifact ${path}: ${message}`);
210
+ return undefined;
211
+ }
212
+ }
213
+ function verifyReportContract(manifest, artifact, failures) {
214
+ const before = failures.length;
215
+ const report = artifact.report;
216
+ if (manifest.generatedAt !== report.generatedAt)
217
+ failures.push("Manifest generatedAt does not match the JSON report.");
218
+ if (manifest.root !== report.root)
219
+ failures.push("Manifest root does not match the JSON report.");
220
+ if (manifest.base !== report.base)
221
+ failures.push("Manifest base does not match the JSON report.");
222
+ if (manifest.head !== report.head)
223
+ failures.push("Manifest head does not match the JSON report.");
224
+ if (manifest.tool?.reportSchemaVersion !== report.schemaVersion)
225
+ failures.push("Manifest tool.reportSchemaVersion does not match the JSON report.");
226
+ if (!samePatchSummary(manifest.summary, report.summary))
227
+ failures.push("Manifest summary does not match the JSON report summary.");
228
+ failures.push(...reportContractFailures(report));
229
+ if (!isReportDigest(manifest.report)) {
230
+ failures.push("Manifest report metadata is invalid.");
231
+ return false;
232
+ }
233
+ if (!Array.isArray(report.findings)) {
234
+ failures.push(`JSON report artifact has invalid findings: ${artifact.path}`);
235
+ }
236
+ else if (manifest.report.findingCount !== report.findings.length) {
237
+ failures.push("Manifest finding count does not match the JSON report.");
238
+ }
239
+ if (!Array.isArray(report.commandPlan)) {
240
+ failures.push(`JSON report artifact has invalid commandPlan: ${artifact.path}`);
241
+ }
242
+ else if (manifest.report.commandPlanCount !== report.commandPlan.length) {
243
+ failures.push("Manifest command plan count does not match the JSON report.");
244
+ }
245
+ if (!Array.isArray(report.commandResults)) {
246
+ failures.push(`JSON report artifact has invalid commandResults: ${artifact.path}`);
247
+ }
248
+ else if (manifest.report.commandResultCount !== report.commandResults.length) {
249
+ failures.push("Manifest command result count does not match the JSON report.");
250
+ }
251
+ else {
252
+ verifyCommandContracts(manifest.commands, report.commandResults, failures);
253
+ }
254
+ return failures.length === before;
255
+ }
256
+ function verifyCommandContracts(manifestCommands, reportCommands, failures) {
257
+ if (!Array.isArray(manifestCommands)) {
258
+ failures.push("Manifest commands must be an array.");
259
+ return;
260
+ }
261
+ if (manifestCommands.length !== reportCommands.length) {
262
+ failures.push("Manifest command list does not match the JSON report command results.");
263
+ return;
264
+ }
265
+ for (const [index, reportCommand] of reportCommands.entries()) {
266
+ const manifestCommand = manifestCommands[index];
267
+ if (!isEvidenceCommand(manifestCommand)) {
268
+ failures.push(`Manifest command entry is invalid at index ${index}.`);
269
+ continue;
270
+ }
271
+ const label = reportCommand.id || String(index);
272
+ if (manifestCommand.id !== reportCommand.id)
273
+ failures.push(`Manifest command id does not match the JSON report for ${label}.`);
274
+ if (manifestCommand.command !== reportCommand.command)
275
+ failures.push(`Manifest command text does not match the JSON report for ${label}.`);
276
+ if (manifestCommand.exitCode !== reportCommand.exitCode)
277
+ failures.push(`Manifest command exit code does not match the JSON report for ${label}.`);
278
+ if (manifestCommand.durationMs !== reportCommand.durationMs)
279
+ failures.push(`Manifest command duration does not match the JSON report for ${label}.`);
280
+ if ((manifestCommand.timedOut ?? undefined) !== (reportCommand.timedOut ?? undefined)) {
281
+ failures.push(`Manifest command timeout state does not match the JSON report for ${label}.`);
282
+ }
283
+ if (!sameDigest(manifestCommand.stdout, digest(reportCommand.stdout)))
284
+ failures.push(`Manifest stdout digest does not match the JSON report for ${label}.`);
285
+ if (!sameDigest(manifestCommand.stderr, digest(reportCommand.stderr)))
286
+ failures.push(`Manifest stderr digest does not match the JSON report for ${label}.`);
287
+ }
288
+ }
289
+ function readArtifact(path, cwd, manifestDir) {
290
+ const candidates = uniqueStrings([resolve(cwd, path), resolve(manifestDir, path)]);
291
+ for (const candidate of candidates) {
292
+ if (!existsSync(candidate))
293
+ continue;
294
+ try {
295
+ return { path: candidate, data: readFileSync(candidate) };
296
+ }
297
+ catch {
298
+ return undefined;
299
+ }
300
+ }
301
+ return undefined;
302
+ }
303
+ function isEvidenceArtifact(value) {
304
+ if (!isRecord(value))
305
+ return false;
306
+ return isEvidenceArtifactKind(value.kind) && typeof value.path === "string" && isDigestLike(value);
307
+ }
308
+ function isEvidenceArtifactKind(value) {
309
+ return value === "summary-markdown" || value === "markdown" || value === "json" || value === "sarif" || value === "html";
310
+ }
311
+ function isEvidenceCommand(value) {
312
+ return (isRecord(value) &&
313
+ typeof value.id === "string" &&
314
+ typeof value.command === "string" &&
315
+ typeof value.exitCode === "number" &&
316
+ typeof value.durationMs === "number" &&
317
+ (value.timedOut === undefined || typeof value.timedOut === "boolean") &&
318
+ isDigestLike(value.stdout) &&
319
+ isDigestLike(value.stderr));
320
+ }
321
+ function isReportDigest(value) {
322
+ return (isDigestLike(value) &&
323
+ isRecord(value) &&
324
+ typeof value.findingCount === "number" &&
325
+ typeof value.commandPlanCount === "number" &&
326
+ typeof value.commandResultCount === "number");
327
+ }
328
+ function isDigestLike(value) {
329
+ return isRecord(value) && typeof value.sha256 === "string" && /^[a-f0-9]{64}$/.test(value.sha256) && typeof value.bytes === "number";
330
+ }
331
+ function isRecord(value) {
332
+ return typeof value === "object" && value !== null;
333
+ }
334
+ function samePatchSummary(left, right) {
335
+ if (!isRecord(left) || !isRecord(right))
336
+ return false;
337
+ return (left.status === right.status &&
338
+ left.riskScore === right.riskScore &&
339
+ left.confidenceScore === right.confidenceScore &&
340
+ left.changedFileCount === right.changedFileCount &&
341
+ left.additions === right.additions &&
342
+ left.deletions === right.deletions &&
343
+ left.requiredCommandCount === right.requiredCommandCount &&
344
+ left.failedCommandCount === right.failedCommandCount);
345
+ }
346
+ function sameDigest(left, right) {
347
+ return left.sha256 === right.sha256 && left.bytes === right.bytes;
348
+ }
349
+ function uniqueStrings(values) {
350
+ return [...new Set(values)];
351
+ }
352
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"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"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import type { AddedLine, ChangedFile } from "./types.js";
2
+ export interface GitDiffOptions {
3
+ cwd: string;
4
+ base?: string;
5
+ head?: string;
6
+ }
7
+ export declare function runGit(cwd: string, args: string[]): string;
8
+ export declare function isGitRepository(cwd: string): boolean;
9
+ export declare function gitRoot(cwd: string): string;
10
+ export declare function hasHead(cwd: string): boolean;
11
+ export declare function readChangedFiles(options: GitDiffOptions): ChangedFile[];
12
+ export declare function readAddedLines(options: GitDiffOptions): AddedLine[];
13
+ export declare function readFilePair(options: GitDiffOptions, path: string): {
14
+ before?: string;
15
+ after?: string;
16
+ };