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,647 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://patchdrill.dev/schemas/patchdrill-report.schema.json",
4
+ "title": "PatchDrill Report",
5
+ "description": "Machine-readable JSON report emitted by PatchDrill scan --json.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schemaVersion",
10
+ "generatedAt",
11
+ "root",
12
+ "summary",
13
+ "changedFiles",
14
+ "addedLines",
15
+ "projectSignals",
16
+ "affectedPackages",
17
+ "dependencyChanges",
18
+ "packageScriptChanges",
19
+ "findings",
20
+ "commandPlan",
21
+ "commandResults",
22
+ "verification"
23
+ ],
24
+ "properties": {
25
+ "schemaVersion": {
26
+ "type": "string",
27
+ "const": "1"
28
+ },
29
+ "generatedAt": {
30
+ "type": "string",
31
+ "format": "date-time"
32
+ },
33
+ "root": {
34
+ "type": "string"
35
+ },
36
+ "base": {
37
+ "type": "string"
38
+ },
39
+ "head": {
40
+ "type": "string"
41
+ },
42
+ "summary": {
43
+ "$ref": "#/$defs/patchSummary"
44
+ },
45
+ "changedFiles": {
46
+ "type": "array",
47
+ "items": {
48
+ "$ref": "#/$defs/changedFile"
49
+ }
50
+ },
51
+ "addedLines": {
52
+ "type": "integer",
53
+ "minimum": 0
54
+ },
55
+ "projectSignals": {
56
+ "type": "array",
57
+ "items": {
58
+ "$ref": "#/$defs/projectSignal"
59
+ }
60
+ },
61
+ "affectedPackages": {
62
+ "type": "array",
63
+ "items": {
64
+ "$ref": "#/$defs/workspacePackage"
65
+ }
66
+ },
67
+ "dependencyChanges": {
68
+ "type": "array",
69
+ "items": {
70
+ "$ref": "#/$defs/dependencyChange"
71
+ }
72
+ },
73
+ "packageScriptChanges": {
74
+ "type": "array",
75
+ "items": {
76
+ "$ref": "#/$defs/packageScriptChange"
77
+ }
78
+ },
79
+ "policy": {
80
+ "$ref": "#/$defs/reportPolicy"
81
+ },
82
+ "codeOwners": {
83
+ "$ref": "#/$defs/codeOwners"
84
+ },
85
+ "baseline": {
86
+ "$ref": "#/$defs/baseline"
87
+ },
88
+ "findings": {
89
+ "type": "array",
90
+ "items": {
91
+ "$ref": "#/$defs/riskFinding"
92
+ }
93
+ },
94
+ "commandPlan": {
95
+ "type": "array",
96
+ "items": {
97
+ "$ref": "#/$defs/commandPlan"
98
+ }
99
+ },
100
+ "commandResults": {
101
+ "type": "array",
102
+ "items": {
103
+ "$ref": "#/$defs/commandResult"
104
+ }
105
+ },
106
+ "verification": {
107
+ "$ref": "#/$defs/patchVerification"
108
+ }
109
+ },
110
+ "$defs": {
111
+ "severity": {
112
+ "type": "string",
113
+ "enum": ["info", "low", "medium", "high", "critical"]
114
+ },
115
+ "patchStatus": {
116
+ "type": "string",
117
+ "enum": ["pass", "warn", "fail"]
118
+ },
119
+ "fileStatus": {
120
+ "type": "string",
121
+ "enum": ["added", "modified", "deleted", "renamed", "copied", "untracked", "unknown"]
122
+ },
123
+ "ecosystem": {
124
+ "type": "string",
125
+ "enum": ["node", "python", "rust", "go", "java", "android", "ruby", "php", "dotnet", "swift", "xcode", "terraform", "docker", "kubernetes", "bazel", "buck", "pants", "github-actions", "unknown"]
126
+ },
127
+ "commandEcosystem": {
128
+ "type": "string",
129
+ "enum": ["node", "python", "rust", "go", "java", "android", "ruby", "php", "dotnet", "swift", "xcode", "terraform", "docker", "kubernetes", "bazel", "buck", "pants", "github-actions", "unknown", "general"]
130
+ },
131
+ "verificationStatus": {
132
+ "type": "string",
133
+ "enum": ["passed", "failed", "timed-out", "not-run", "skipped-optional"]
134
+ },
135
+ "patchSummary": {
136
+ "type": "object",
137
+ "additionalProperties": false,
138
+ "required": [
139
+ "status",
140
+ "riskScore",
141
+ "confidenceScore",
142
+ "changedFileCount",
143
+ "additions",
144
+ "deletions",
145
+ "requiredCommandCount",
146
+ "failedCommandCount"
147
+ ],
148
+ "properties": {
149
+ "status": {
150
+ "$ref": "#/$defs/patchStatus"
151
+ },
152
+ "riskScore": {
153
+ "type": "integer",
154
+ "minimum": 0,
155
+ "maximum": 100
156
+ },
157
+ "confidenceScore": {
158
+ "type": "integer",
159
+ "minimum": 0,
160
+ "maximum": 100
161
+ },
162
+ "changedFileCount": {
163
+ "type": "integer",
164
+ "minimum": 0
165
+ },
166
+ "additions": {
167
+ "type": "integer",
168
+ "minimum": 0
169
+ },
170
+ "deletions": {
171
+ "type": "integer",
172
+ "minimum": 0
173
+ },
174
+ "requiredCommandCount": {
175
+ "type": "integer",
176
+ "minimum": 0
177
+ },
178
+ "failedCommandCount": {
179
+ "type": "integer",
180
+ "minimum": 0
181
+ }
182
+ }
183
+ },
184
+ "changedFile": {
185
+ "type": "object",
186
+ "additionalProperties": false,
187
+ "required": ["path", "status", "additions", "deletions", "binary"],
188
+ "properties": {
189
+ "path": {
190
+ "type": "string"
191
+ },
192
+ "previousPath": {
193
+ "type": "string"
194
+ },
195
+ "status": {
196
+ "$ref": "#/$defs/fileStatus"
197
+ },
198
+ "additions": {
199
+ "type": "integer",
200
+ "minimum": 0
201
+ },
202
+ "deletions": {
203
+ "type": "integer",
204
+ "minimum": 0
205
+ },
206
+ "binary": {
207
+ "type": "boolean"
208
+ },
209
+ "owners": {
210
+ "type": "array",
211
+ "items": {
212
+ "type": "string"
213
+ }
214
+ }
215
+ }
216
+ },
217
+ "projectSignal": {
218
+ "type": "object",
219
+ "additionalProperties": false,
220
+ "required": ["ecosystem", "manifestPath"],
221
+ "properties": {
222
+ "ecosystem": {
223
+ "$ref": "#/$defs/ecosystem"
224
+ },
225
+ "manifestPath": {
226
+ "type": "string"
227
+ },
228
+ "framework": {
229
+ "type": "string",
230
+ "enum": ["django", "fastapi", "spring-boot", "rails", "laravel", "aspnet-core"]
231
+ },
232
+ "entrypoint": {
233
+ "type": "string",
234
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*:[A-Za-z_][A-Za-z0-9_]*$"
235
+ },
236
+ "packageManager": {
237
+ "type": "string"
238
+ },
239
+ "taskRunner": {
240
+ "type": "string",
241
+ "enum": ["turbo", "nx"]
242
+ },
243
+ "scripts": {
244
+ "type": "object",
245
+ "additionalProperties": {
246
+ "type": "string"
247
+ }
248
+ },
249
+ "workspacePackages": {
250
+ "type": "array",
251
+ "items": {
252
+ "$ref": "#/$defs/workspacePackage"
253
+ }
254
+ }
255
+ }
256
+ },
257
+ "workspacePackage": {
258
+ "type": "object",
259
+ "additionalProperties": false,
260
+ "required": ["name", "path", "scripts"],
261
+ "properties": {
262
+ "name": {
263
+ "type": "string"
264
+ },
265
+ "projectName": {
266
+ "type": "string"
267
+ },
268
+ "path": {
269
+ "type": "string"
270
+ },
271
+ "scripts": {
272
+ "type": "object",
273
+ "additionalProperties": {
274
+ "type": "string"
275
+ }
276
+ },
277
+ "targets": {
278
+ "type": "array",
279
+ "items": {
280
+ "type": "string"
281
+ }
282
+ },
283
+ "dependencies": {
284
+ "type": "array",
285
+ "items": {
286
+ "type": "string"
287
+ }
288
+ }
289
+ }
290
+ },
291
+ "dependencyChange": {
292
+ "type": "object",
293
+ "additionalProperties": false,
294
+ "required": ["file", "packageName", "dependencyType", "changeType"],
295
+ "properties": {
296
+ "file": {
297
+ "type": "string"
298
+ },
299
+ "packageName": {
300
+ "type": "string"
301
+ },
302
+ "dependencyType": {
303
+ "type": "string",
304
+ "enum": ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies", "lockfile"]
305
+ },
306
+ "changeType": {
307
+ "type": "string",
308
+ "enum": ["added", "removed", "updated"]
309
+ },
310
+ "packagePath": {
311
+ "type": "string"
312
+ },
313
+ "before": {
314
+ "type": "string"
315
+ },
316
+ "after": {
317
+ "type": "string"
318
+ }
319
+ }
320
+ },
321
+ "packageScriptChange": {
322
+ "type": "object",
323
+ "additionalProperties": false,
324
+ "required": ["file", "scriptName", "changeType"],
325
+ "properties": {
326
+ "file": {
327
+ "type": "string"
328
+ },
329
+ "scriptName": {
330
+ "type": "string"
331
+ },
332
+ "changeType": {
333
+ "type": "string",
334
+ "enum": ["added", "removed", "updated"]
335
+ },
336
+ "before": {
337
+ "type": "string"
338
+ },
339
+ "after": {
340
+ "type": "string"
341
+ }
342
+ }
343
+ },
344
+ "reportPolicy": {
345
+ "type": "object",
346
+ "additionalProperties": false,
347
+ "required": ["path", "ignoredPaths", "ruleCount", "requiredCommandCount", "optionalCommandCount"],
348
+ "properties": {
349
+ "path": {
350
+ "type": "string"
351
+ },
352
+ "ignoredPaths": {
353
+ "type": "array",
354
+ "items": {
355
+ "type": "string"
356
+ }
357
+ },
358
+ "failOn": {
359
+ "$ref": "#/$defs/severity"
360
+ },
361
+ "maxRisk": {
362
+ "type": "integer",
363
+ "minimum": 0,
364
+ "maximum": 100
365
+ },
366
+ "ruleCount": {
367
+ "type": "integer",
368
+ "minimum": 0
369
+ },
370
+ "requiredCommandCount": {
371
+ "type": "integer",
372
+ "minimum": 0
373
+ },
374
+ "optionalCommandCount": {
375
+ "type": "integer",
376
+ "minimum": 0
377
+ }
378
+ }
379
+ },
380
+ "riskFinding": {
381
+ "type": "object",
382
+ "additionalProperties": false,
383
+ "required": ["severity", "title", "detail"],
384
+ "properties": {
385
+ "ruleId": {
386
+ "type": "string"
387
+ },
388
+ "severity": {
389
+ "$ref": "#/$defs/severity"
390
+ },
391
+ "title": {
392
+ "type": "string"
393
+ },
394
+ "detail": {
395
+ "type": "string"
396
+ },
397
+ "file": {
398
+ "type": "string"
399
+ },
400
+ "line": {
401
+ "type": "integer",
402
+ "minimum": 1
403
+ },
404
+ "remediation": {
405
+ "type": "string"
406
+ },
407
+ "tags": {
408
+ "type": "array",
409
+ "items": {
410
+ "type": "string"
411
+ }
412
+ }
413
+ }
414
+ },
415
+ "codeOwners": {
416
+ "type": "object",
417
+ "additionalProperties": false,
418
+ "required": ["path", "ruleCount"],
419
+ "properties": {
420
+ "path": {
421
+ "type": "string"
422
+ },
423
+ "ruleCount": {
424
+ "type": "integer",
425
+ "minimum": 0
426
+ }
427
+ }
428
+ },
429
+ "baseline": {
430
+ "type": "object",
431
+ "additionalProperties": false,
432
+ "required": [
433
+ "path",
434
+ "currentStatus",
435
+ "currentRiskScore",
436
+ "riskDelta",
437
+ "newFindingCount",
438
+ "resolvedFindingCount",
439
+ "unchangedFindingCount"
440
+ ],
441
+ "properties": {
442
+ "path": {
443
+ "type": "string"
444
+ },
445
+ "previousStatus": {
446
+ "$ref": "#/$defs/patchStatus"
447
+ },
448
+ "currentStatus": {
449
+ "$ref": "#/$defs/patchStatus"
450
+ },
451
+ "previousRiskScore": {
452
+ "type": "integer",
453
+ "minimum": 0,
454
+ "maximum": 100
455
+ },
456
+ "currentRiskScore": {
457
+ "type": "integer",
458
+ "minimum": 0,
459
+ "maximum": 100
460
+ },
461
+ "riskDelta": {
462
+ "type": "integer",
463
+ "minimum": -100,
464
+ "maximum": 100
465
+ },
466
+ "newFindingCount": {
467
+ "type": "integer",
468
+ "minimum": 0
469
+ },
470
+ "resolvedFindingCount": {
471
+ "type": "integer",
472
+ "minimum": 0
473
+ },
474
+ "unchangedFindingCount": {
475
+ "type": "integer",
476
+ "minimum": 0
477
+ }
478
+ }
479
+ },
480
+ "patchVerification": {
481
+ "type": "object",
482
+ "additionalProperties": false,
483
+ "required": ["summary", "commands"],
484
+ "properties": {
485
+ "summary": {
486
+ "$ref": "#/$defs/verificationSummary"
487
+ },
488
+ "commands": {
489
+ "type": "array",
490
+ "items": {
491
+ "$ref": "#/$defs/verificationCommand"
492
+ }
493
+ }
494
+ }
495
+ },
496
+ "verificationSummary": {
497
+ "type": "object",
498
+ "additionalProperties": false,
499
+ "required": ["plannedRequired", "plannedOptional", "run", "passed", "failed", "timedOut", "missingRequired", "skippedOptional", "unplannedResults"],
500
+ "properties": {
501
+ "plannedRequired": {
502
+ "type": "integer",
503
+ "minimum": 0
504
+ },
505
+ "plannedOptional": {
506
+ "type": "integer",
507
+ "minimum": 0
508
+ },
509
+ "run": {
510
+ "type": "integer",
511
+ "minimum": 0
512
+ },
513
+ "passed": {
514
+ "type": "integer",
515
+ "minimum": 0
516
+ },
517
+ "failed": {
518
+ "type": "integer",
519
+ "minimum": 0
520
+ },
521
+ "timedOut": {
522
+ "type": "integer",
523
+ "minimum": 0
524
+ },
525
+ "missingRequired": {
526
+ "type": "integer",
527
+ "minimum": 0
528
+ },
529
+ "skippedOptional": {
530
+ "type": "integer",
531
+ "minimum": 0
532
+ },
533
+ "unplannedResults": {
534
+ "type": "integer",
535
+ "minimum": 0
536
+ }
537
+ }
538
+ },
539
+ "verificationCommand": {
540
+ "type": "object",
541
+ "additionalProperties": false,
542
+ "required": ["id", "label", "command", "reason", "ecosystem", "required", "planned", "status"],
543
+ "properties": {
544
+ "id": {
545
+ "type": "string"
546
+ },
547
+ "label": {
548
+ "type": "string"
549
+ },
550
+ "command": {
551
+ "type": "string"
552
+ },
553
+ "reason": {
554
+ "type": "string"
555
+ },
556
+ "ecosystem": {
557
+ "$ref": "#/$defs/commandEcosystem"
558
+ },
559
+ "required": {
560
+ "type": "boolean"
561
+ },
562
+ "planned": {
563
+ "type": "boolean"
564
+ },
565
+ "status": {
566
+ "$ref": "#/$defs/verificationStatus"
567
+ },
568
+ "packageName": {
569
+ "type": "string"
570
+ },
571
+ "packagePath": {
572
+ "type": "string"
573
+ },
574
+ "exitCode": {
575
+ "type": "integer"
576
+ },
577
+ "durationMs": {
578
+ "type": "integer",
579
+ "minimum": 0
580
+ },
581
+ "timedOut": {
582
+ "type": "boolean"
583
+ }
584
+ }
585
+ },
586
+ "commandPlan": {
587
+ "type": "object",
588
+ "additionalProperties": false,
589
+ "required": ["id", "label", "command", "reason", "ecosystem", "required"],
590
+ "properties": {
591
+ "id": {
592
+ "type": "string"
593
+ },
594
+ "label": {
595
+ "type": "string"
596
+ },
597
+ "command": {
598
+ "type": "string"
599
+ },
600
+ "reason": {
601
+ "type": "string"
602
+ },
603
+ "ecosystem": {
604
+ "$ref": "#/$defs/commandEcosystem"
605
+ },
606
+ "required": {
607
+ "type": "boolean"
608
+ },
609
+ "packageName": {
610
+ "type": "string"
611
+ },
612
+ "packagePath": {
613
+ "type": "string"
614
+ }
615
+ }
616
+ },
617
+ "commandResult": {
618
+ "type": "object",
619
+ "additionalProperties": false,
620
+ "required": ["id", "command", "exitCode", "durationMs", "stdout", "stderr"],
621
+ "properties": {
622
+ "id": {
623
+ "type": "string"
624
+ },
625
+ "command": {
626
+ "type": "string"
627
+ },
628
+ "exitCode": {
629
+ "type": "integer"
630
+ },
631
+ "durationMs": {
632
+ "type": "integer",
633
+ "minimum": 0
634
+ },
635
+ "stdout": {
636
+ "type": "string"
637
+ },
638
+ "stderr": {
639
+ "type": "string"
640
+ },
641
+ "timedOut": {
642
+ "type": "boolean"
643
+ }
644
+ }
645
+ }
646
+ }
647
+ }