@veraxhq/verax 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -6
- package/bin/verax.js +11 -11
- package/package.json +29 -8
- package/src/cli/commands/baseline.js +103 -0
- package/src/cli/commands/default.js +51 -6
- package/src/cli/commands/doctor.js +29 -0
- package/src/cli/commands/ga.js +246 -0
- package/src/cli/commands/gates.js +95 -0
- package/src/cli/commands/inspect.js +4 -2
- package/src/cli/commands/release-check.js +215 -0
- package/src/cli/commands/run.js +45 -6
- package/src/cli/commands/security-check.js +212 -0
- package/src/cli/commands/truth.js +113 -0
- package/src/cli/entry.js +30 -20
- package/src/cli/util/angular-component-extractor.js +179 -0
- package/src/cli/util/angular-navigation-detector.js +141 -0
- package/src/cli/util/angular-network-detector.js +161 -0
- package/src/cli/util/angular-state-detector.js +162 -0
- package/src/cli/util/ast-interactive-detector.js +544 -0
- package/src/cli/util/ast-network-detector.js +603 -0
- package/src/cli/util/ast-promise-extractor.js +581 -0
- package/src/cli/util/ast-usestate-detector.js +602 -0
- package/src/cli/util/atomic-write.js +12 -1
- package/src/cli/util/bootstrap-guard.js +86 -0
- package/src/cli/util/console-reporter.js +72 -0
- package/src/cli/util/detection-engine.js +105 -41
- package/src/cli/util/determinism-runner.js +124 -0
- package/src/cli/util/determinism-writer.js +129 -0
- package/src/cli/util/digest-engine.js +359 -0
- package/src/cli/util/dom-diff.js +226 -0
- package/src/cli/util/evidence-engine.js +287 -0
- package/src/cli/util/expectation-extractor.js +151 -5
- package/src/cli/util/findings-writer.js +3 -0
- package/src/cli/util/framework-detector.js +572 -0
- package/src/cli/util/idgen.js +1 -1
- package/src/cli/util/interaction-planner.js +529 -0
- package/src/cli/util/learn-writer.js +2 -0
- package/src/cli/util/ledger-writer.js +110 -0
- package/src/cli/util/monorepo-resolver.js +162 -0
- package/src/cli/util/observation-engine.js +127 -278
- package/src/cli/util/observe-writer.js +2 -0
- package/src/cli/util/project-discovery.js +284 -0
- package/src/cli/util/project-writer.js +2 -0
- package/src/cli/util/run-id.js +23 -27
- package/src/cli/util/run-resolver.js +64 -0
- package/src/cli/util/run-result.js +778 -0
- package/src/cli/util/selector-resolver.js +235 -0
- package/src/cli/util/source-requirement.js +55 -0
- package/src/cli/util/summary-writer.js +2 -0
- package/src/cli/util/svelte-navigation-detector.js +163 -0
- package/src/cli/util/svelte-network-detector.js +80 -0
- package/src/cli/util/svelte-sfc-extractor.js +146 -0
- package/src/cli/util/svelte-state-detector.js +242 -0
- package/src/cli/util/trust-activation-integration.js +496 -0
- package/src/cli/util/trust-activation-wrapper.js +85 -0
- package/src/cli/util/trust-integration-hooks.js +164 -0
- package/src/cli/util/types.js +153 -0
- package/src/cli/util/url-validation.js +40 -0
- package/src/cli/util/vue-navigation-detector.js +178 -0
- package/src/cli/util/vue-sfc-extractor.js +161 -0
- package/src/cli/util/vue-state-detector.js +215 -0
- package/src/types/fs-augment.d.ts +23 -0
- package/src/types/global.d.ts +137 -0
- package/src/types/internal-types.d.ts +35 -0
- package/src/verax/cli/init.js +4 -18
- package/src/verax/core/action-classifier.js +4 -3
- package/src/verax/core/artifacts/registry.js +139 -0
- package/src/verax/core/artifacts/verifier.js +990 -0
- package/src/verax/core/baseline/baseline.enforcer.js +137 -0
- package/src/verax/core/baseline/baseline.snapshot.js +233 -0
- package/src/verax/core/capabilities/gates.js +505 -0
- package/src/verax/core/capabilities/registry.js +475 -0
- package/src/verax/core/confidence/confidence-compute.js +144 -0
- package/src/verax/core/confidence/confidence-invariants.js +234 -0
- package/src/verax/core/confidence/confidence-report-writer.js +112 -0
- package/src/verax/core/confidence/confidence-weights.js +44 -0
- package/src/verax/core/confidence/confidence.defaults.js +65 -0
- package/src/verax/core/confidence/confidence.loader.js +80 -0
- package/src/verax/core/confidence/confidence.schema.js +94 -0
- package/src/verax/core/confidence-engine-refactor.js +489 -0
- package/src/verax/core/confidence-engine.js +625 -0
- package/src/verax/core/contracts/index.js +29 -0
- package/src/verax/core/contracts/types.js +186 -0
- package/src/verax/core/contracts/validators.js +456 -0
- package/src/verax/core/decisions/decision.trace.js +278 -0
- package/src/verax/core/determinism/contract-writer.js +89 -0
- package/src/verax/core/determinism/contract.js +139 -0
- package/src/verax/core/determinism/diff.js +405 -0
- package/src/verax/core/determinism/engine.js +222 -0
- package/src/verax/core/determinism/finding-identity.js +149 -0
- package/src/verax/core/determinism/normalize.js +466 -0
- package/src/verax/core/determinism/report-writer.js +93 -0
- package/src/verax/core/determinism/run-fingerprint.js +123 -0
- package/src/verax/core/dynamic-route-intelligence.js +529 -0
- package/src/verax/core/evidence/evidence-capture-service.js +308 -0
- package/src/verax/core/evidence/evidence-intent-ledger.js +166 -0
- package/src/verax/core/evidence-builder.js +487 -0
- package/src/verax/core/execution-mode-context.js +77 -0
- package/src/verax/core/execution-mode-detector.js +192 -0
- package/src/verax/core/failures/exit-codes.js +88 -0
- package/src/verax/core/failures/failure-summary.js +76 -0
- package/src/verax/core/failures/failure.factory.js +225 -0
- package/src/verax/core/failures/failure.ledger.js +133 -0
- package/src/verax/core/failures/failure.types.js +196 -0
- package/src/verax/core/failures/index.js +10 -0
- package/src/verax/core/ga/ga-report-writer.js +43 -0
- package/src/verax/core/ga/ga.artifact.js +49 -0
- package/src/verax/core/ga/ga.contract.js +435 -0
- package/src/verax/core/ga/ga.enforcer.js +87 -0
- package/src/verax/core/guardrails/guardrails-report-writer.js +109 -0
- package/src/verax/core/guardrails/policy.defaults.js +210 -0
- package/src/verax/core/guardrails/policy.loader.js +84 -0
- package/src/verax/core/guardrails/policy.schema.js +110 -0
- package/src/verax/core/guardrails/truth-reconciliation.js +136 -0
- package/src/verax/core/guardrails-engine.js +505 -0
- package/src/verax/core/incremental-store.js +1 -0
- package/src/verax/core/integrity/budget.js +138 -0
- package/src/verax/core/integrity/determinism.js +342 -0
- package/src/verax/core/integrity/integrity.js +208 -0
- package/src/verax/core/integrity/poisoning.js +108 -0
- package/src/verax/core/integrity/transaction.js +140 -0
- package/src/verax/core/observe/run-timeline.js +318 -0
- package/src/verax/core/perf/perf.contract.js +186 -0
- package/src/verax/core/perf/perf.display.js +65 -0
- package/src/verax/core/perf/perf.enforcer.js +91 -0
- package/src/verax/core/perf/perf.monitor.js +209 -0
- package/src/verax/core/perf/perf.report.js +200 -0
- package/src/verax/core/pipeline-tracker.js +243 -0
- package/src/verax/core/product-definition.js +127 -0
- package/src/verax/core/release/provenance.builder.js +130 -0
- package/src/verax/core/release/release-report-writer.js +40 -0
- package/src/verax/core/release/release.enforcer.js +164 -0
- package/src/verax/core/release/reproducibility.check.js +222 -0
- package/src/verax/core/release/sbom.builder.js +292 -0
- package/src/verax/core/replay-validator.js +2 -0
- package/src/verax/core/replay.js +4 -0
- package/src/verax/core/report/cross-index.js +195 -0
- package/src/verax/core/report/human-summary.js +362 -0
- package/src/verax/core/route-intelligence.js +420 -0
- package/src/verax/core/run-id.js +6 -3
- package/src/verax/core/run-manifest.js +4 -3
- package/src/verax/core/security/secrets.scan.js +329 -0
- package/src/verax/core/security/security-report.js +50 -0
- package/src/verax/core/security/security.enforcer.js +128 -0
- package/src/verax/core/security/supplychain.defaults.json +38 -0
- package/src/verax/core/security/supplychain.policy.js +334 -0
- package/src/verax/core/security/vuln.scan.js +265 -0
- package/src/verax/core/truth/truth.certificate.js +252 -0
- package/src/verax/core/ui-feedback-intelligence.js +481 -0
- package/src/verax/detect/conditional-ui-silent-failure.js +84 -0
- package/src/verax/detect/confidence-engine.js +62 -34
- package/src/verax/detect/confidence-helper.js +34 -0
- package/src/verax/detect/dynamic-route-findings.js +338 -0
- package/src/verax/detect/expectation-chain-detector.js +417 -0
- package/src/verax/detect/expectation-model.js +2 -2
- package/src/verax/detect/failure-cause-inference.js +293 -0
- package/src/verax/detect/findings-writer.js +131 -35
- package/src/verax/detect/flow-detector.js +2 -2
- package/src/verax/detect/form-silent-failure.js +98 -0
- package/src/verax/detect/index.js +46 -5
- package/src/verax/detect/invariants-enforcer.js +147 -0
- package/src/verax/detect/journey-stall-detector.js +558 -0
- package/src/verax/detect/navigation-silent-failure.js +82 -0
- package/src/verax/detect/problem-aggregator.js +361 -0
- package/src/verax/detect/route-findings.js +219 -0
- package/src/verax/detect/summary-writer.js +477 -0
- package/src/verax/detect/test-failure-cause-inference.js +314 -0
- package/src/verax/detect/ui-feedback-findings.js +207 -0
- package/src/verax/detect/view-switch-correlator.js +242 -0
- package/src/verax/flow/flow-engine.js +2 -1
- package/src/verax/flow/flow-spec.js +0 -6
- package/src/verax/index.js +4 -0
- package/src/verax/intel/ts-program.js +1 -0
- package/src/verax/intel/vue-navigation-extractor.js +3 -0
- package/src/verax/learn/action-contract-extractor.js +3 -0
- package/src/verax/learn/ast-contract-extractor.js +1 -1
- package/src/verax/learn/flow-extractor.js +1 -0
- package/src/verax/learn/project-detector.js +5 -0
- package/src/verax/learn/react-router-extractor.js +2 -0
- package/src/verax/learn/source-instrumenter.js +1 -0
- package/src/verax/learn/state-extractor.js +2 -1
- package/src/verax/learn/static-extractor.js +1 -0
- package/src/verax/observe/coverage-gaps.js +132 -0
- package/src/verax/observe/expectation-handler.js +126 -0
- package/src/verax/observe/incremental-skip.js +46 -0
- package/src/verax/observe/index.js +51 -155
- package/src/verax/observe/interaction-executor.js +192 -0
- package/src/verax/observe/interaction-runner.js +782 -513
- package/src/verax/observe/network-firewall.js +86 -0
- package/src/verax/observe/observation-builder.js +169 -0
- package/src/verax/observe/observe-context.js +205 -0
- package/src/verax/observe/observe-helpers.js +192 -0
- package/src/verax/observe/observe-runner.js +230 -0
- package/src/verax/observe/observers/budget-observer.js +185 -0
- package/src/verax/observe/observers/console-observer.js +102 -0
- package/src/verax/observe/observers/coverage-observer.js +107 -0
- package/src/verax/observe/observers/interaction-observer.js +471 -0
- package/src/verax/observe/observers/navigation-observer.js +132 -0
- package/src/verax/observe/observers/network-observer.js +87 -0
- package/src/verax/observe/observers/safety-observer.js +82 -0
- package/src/verax/observe/observers/ui-feedback-observer.js +99 -0
- package/src/verax/observe/page-traversal.js +138 -0
- package/src/verax/observe/snapshot-ops.js +94 -0
- package/src/verax/observe/ui-feedback-detector.js +742 -0
- package/src/verax/scan-summary-writer.js +2 -0
- package/src/verax/shared/artifact-manager.js +25 -5
- package/src/verax/shared/caching.js +1 -0
- package/src/verax/shared/css-spinner-rules.js +204 -0
- package/src/verax/shared/expectation-tracker.js +1 -0
- package/src/verax/shared/view-switch-rules.js +208 -0
- package/src/verax/shared/zip-artifacts.js +6 -0
- package/src/verax/shared/config-loader.js +0 -169
- /package/src/verax/shared/{expectation-proof.js → expectation-validation.js} +0 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PHASE 21.11 — Truth Certificate
|
|
3
|
+
*
|
|
4
|
+
* Generates a comprehensive certificate of truth for Enterprise audit.
|
|
5
|
+
* This is the document presented to management/audit/enterprise.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { readFileSync, existsSync, writeFileSync } from 'fs';
|
|
9
|
+
import { resolve } from 'path';
|
|
10
|
+
import { loadBaselineSnapshot } from '../baseline/baseline.snapshot.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Load artifact JSON
|
|
14
|
+
*/
|
|
15
|
+
function loadArtifact(runDir, filename) {
|
|
16
|
+
const path = resolve(runDir, filename);
|
|
17
|
+
if (!existsSync(path)) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
// @ts-expect-error - readFileSync with encoding returns string
|
|
22
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Generate truth certificate
|
|
30
|
+
*
|
|
31
|
+
* @param {string} projectDir - Project directory
|
|
32
|
+
* @param {string} runId - Run ID
|
|
33
|
+
* @returns {Promise<Object>} Truth certificate
|
|
34
|
+
*/
|
|
35
|
+
export async function generateTruthCertificate(projectDir, runId) {
|
|
36
|
+
const runDir = resolve(projectDir, '.verax', 'runs', runId);
|
|
37
|
+
|
|
38
|
+
if (!existsSync(runDir)) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Load all relevant artifacts
|
|
43
|
+
const summary = loadArtifact(runDir, 'summary.json');
|
|
44
|
+
const findings = loadArtifact(runDir, 'findings.json');
|
|
45
|
+
const failureLedger = loadArtifact(runDir, 'failure.ledger.json');
|
|
46
|
+
const performanceReport = loadArtifact(runDir, 'performance.report.json');
|
|
47
|
+
const gaStatus = loadArtifact(runDir, 'ga.status.json');
|
|
48
|
+
const decisions = loadArtifact(runDir, 'decisions.json');
|
|
49
|
+
|
|
50
|
+
// Security reports
|
|
51
|
+
const releaseDir = resolve(projectDir, 'release');
|
|
52
|
+
const securitySecrets = loadArtifact(releaseDir, 'security.secrets.report.json');
|
|
53
|
+
const securityVuln = loadArtifact(releaseDir, 'security.vuln.report.json');
|
|
54
|
+
|
|
55
|
+
// Release provenance
|
|
56
|
+
const provenance = loadArtifact(releaseDir, 'release.provenance.json');
|
|
57
|
+
|
|
58
|
+
// Baseline snapshot
|
|
59
|
+
const baseline = loadBaselineSnapshot(projectDir);
|
|
60
|
+
|
|
61
|
+
// Evidence Law status
|
|
62
|
+
let evidenceLawStatus = 'UNKNOWN';
|
|
63
|
+
let evidenceLawViolated = false;
|
|
64
|
+
|
|
65
|
+
if (findings?.findings) {
|
|
66
|
+
for (const finding of findings.findings) {
|
|
67
|
+
if ((finding.severity === 'CONFIRMED' || finding.status === 'CONFIRMED') &&
|
|
68
|
+
finding.evidencePackage && !finding.evidencePackage.isComplete) {
|
|
69
|
+
evidenceLawViolated = true;
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
evidenceLawStatus = evidenceLawViolated ? 'VIOLATED' : 'ENFORCED';
|
|
75
|
+
|
|
76
|
+
// Determinism verdict
|
|
77
|
+
let determinismVerdict = 'UNKNOWN';
|
|
78
|
+
if (decisions) {
|
|
79
|
+
try {
|
|
80
|
+
const { DecisionRecorder } = await import('../../core/determinism-model.js');
|
|
81
|
+
const recorder = DecisionRecorder.fromExport(decisions);
|
|
82
|
+
const { computeDeterminismVerdict } = await import('../../core/determinism/contract.js');
|
|
83
|
+
const verdict = computeDeterminismVerdict(recorder);
|
|
84
|
+
determinismVerdict = verdict.verdict;
|
|
85
|
+
} catch {
|
|
86
|
+
determinismVerdict = summary?.determinism?.verdict || 'UNKNOWN';
|
|
87
|
+
}
|
|
88
|
+
} else if (summary?.determinism) {
|
|
89
|
+
determinismVerdict = summary.determinism.verdict || 'UNKNOWN';
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Failure summary
|
|
93
|
+
const failureSummary = failureLedger?.summary || {
|
|
94
|
+
total: 0,
|
|
95
|
+
bySeverity: {},
|
|
96
|
+
byCategory: {}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// GA verdict
|
|
100
|
+
const gaVerdict = gaStatus?.gaReady === true ? 'GA-READY' : (gaStatus ? 'GA-BLOCKED' : 'UNKNOWN');
|
|
101
|
+
const gaBlockers = gaStatus?.blockers || [];
|
|
102
|
+
const gaWarnings = gaStatus?.warnings || [];
|
|
103
|
+
|
|
104
|
+
// Security verdict
|
|
105
|
+
const securityVerdict = {
|
|
106
|
+
secrets: securitySecrets?.hasSecrets ? 'BLOCKED' : (securitySecrets ? 'OK' : 'NOT_CHECKED'),
|
|
107
|
+
vulnerabilities: securityVuln?.blocking ? 'BLOCKED' : (securityVuln ? 'OK' : 'NOT_CHECKED'),
|
|
108
|
+
overall: (securitySecrets?.hasSecrets || securityVuln?.blocking) ? 'BLOCKED' :
|
|
109
|
+
(securitySecrets || securityVuln) ? 'OK' : 'NOT_CHECKED'
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Performance verdict
|
|
113
|
+
const performanceVerdict = performanceReport?.verdict || 'UNKNOWN';
|
|
114
|
+
const performanceOk = performanceReport?.ok !== false;
|
|
115
|
+
const performanceViolations = performanceReport?.violations || [];
|
|
116
|
+
|
|
117
|
+
// Baseline hash
|
|
118
|
+
const baselineHash = baseline?.baselineHash || null;
|
|
119
|
+
|
|
120
|
+
// Release provenance hash
|
|
121
|
+
const provenanceHash = provenance?.hashes?.dist || null;
|
|
122
|
+
|
|
123
|
+
const certificate = {
|
|
124
|
+
version: 1,
|
|
125
|
+
runId,
|
|
126
|
+
generatedAt: new Date().toISOString(),
|
|
127
|
+
url: summary?.url || null,
|
|
128
|
+
|
|
129
|
+
// Evidence Law
|
|
130
|
+
evidenceLaw: {
|
|
131
|
+
status: evidenceLawStatus,
|
|
132
|
+
violated: evidenceLawViolated,
|
|
133
|
+
statement: 'A finding cannot be marked CONFIRMED without sufficient evidence.'
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
// Determinism
|
|
137
|
+
determinism: {
|
|
138
|
+
verdict: determinismVerdict,
|
|
139
|
+
message: determinismVerdict === 'DETERMINISTIC'
|
|
140
|
+
? 'Run was reproducible (same inputs = same outputs)'
|
|
141
|
+
: determinismVerdict === 'NON_DETERMINISTIC'
|
|
142
|
+
? 'Run was not reproducible (adaptive events detected)'
|
|
143
|
+
: 'Determinism not evaluated'
|
|
144
|
+
},
|
|
145
|
+
|
|
146
|
+
// Failures
|
|
147
|
+
failures: {
|
|
148
|
+
total: failureSummary.total,
|
|
149
|
+
bySeverity: failureSummary.bySeverity || {},
|
|
150
|
+
byCategory: failureSummary.byCategory || {},
|
|
151
|
+
blocking: (failureSummary.bySeverity?.BLOCKING || 0) > 0,
|
|
152
|
+
degraded: (failureSummary.bySeverity?.DEGRADED || 0) > 0
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
// GA
|
|
156
|
+
ga: {
|
|
157
|
+
verdict: gaVerdict,
|
|
158
|
+
ready: gaStatus?.gaReady === true,
|
|
159
|
+
blockers: gaBlockers.length,
|
|
160
|
+
warnings: gaWarnings.length,
|
|
161
|
+
details: {
|
|
162
|
+
blockers: gaBlockers.map(b => ({ code: b.code, message: b.message })),
|
|
163
|
+
warnings: gaWarnings.map(w => ({ code: w.code, message: w.message }))
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
|
|
167
|
+
// Security
|
|
168
|
+
security: securityVerdict,
|
|
169
|
+
|
|
170
|
+
// Performance
|
|
171
|
+
performance: {
|
|
172
|
+
verdict: performanceVerdict,
|
|
173
|
+
ok: performanceOk,
|
|
174
|
+
violations: performanceViolations.length,
|
|
175
|
+
details: performanceViolations.map(v => ({
|
|
176
|
+
type: v.type,
|
|
177
|
+
actual: v.actual,
|
|
178
|
+
budget: v.budget
|
|
179
|
+
}))
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
// Baseline
|
|
183
|
+
baseline: {
|
|
184
|
+
hash: baselineHash,
|
|
185
|
+
frozen: baseline?.frozen || false,
|
|
186
|
+
version: baseline?.veraxVersion || null,
|
|
187
|
+
commit: baseline?.gitCommit || null
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
// Release provenance
|
|
191
|
+
provenance: {
|
|
192
|
+
hash: provenanceHash,
|
|
193
|
+
version: provenance?.version || null,
|
|
194
|
+
commit: provenance?.git?.commit || null
|
|
195
|
+
},
|
|
196
|
+
|
|
197
|
+
// Overall verdict
|
|
198
|
+
overallVerdict: {
|
|
199
|
+
status: (gaVerdict === 'GA-READY' &&
|
|
200
|
+
evidenceLawStatus === 'ENFORCED' &&
|
|
201
|
+
securityVerdict.overall === 'OK' &&
|
|
202
|
+
performanceOk) ? 'CERTIFIED' : 'NOT_CERTIFIED',
|
|
203
|
+
reasons: [
|
|
204
|
+
evidenceLawViolated ? 'Evidence Law violated' : null,
|
|
205
|
+
gaVerdict !== 'GA-READY' ? 'GA not ready' : null,
|
|
206
|
+
securityVerdict.overall !== 'OK' ? 'Security blocked' : null,
|
|
207
|
+
!performanceOk ? 'Performance violations' : null
|
|
208
|
+
].filter(Boolean)
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
return certificate;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Write truth certificate to file
|
|
217
|
+
*
|
|
218
|
+
* @param {string} projectDir - Project directory
|
|
219
|
+
* @param {string} runId - Run ID
|
|
220
|
+
* @param {Object} certificate - Truth certificate
|
|
221
|
+
* @returns {string} Path to written file
|
|
222
|
+
*/
|
|
223
|
+
export function writeTruthCertificate(projectDir, runId, certificate) {
|
|
224
|
+
const runDir = resolve(projectDir, '.verax', 'runs', runId);
|
|
225
|
+
const outputPath = resolve(runDir, 'truth.certificate.json');
|
|
226
|
+
writeFileSync(outputPath, JSON.stringify(certificate, null, 2), 'utf-8');
|
|
227
|
+
return outputPath;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Load truth certificate from file
|
|
232
|
+
*
|
|
233
|
+
* @param {string} projectDir - Project directory
|
|
234
|
+
* @param {string} runId - Run ID
|
|
235
|
+
* @returns {Object|null} Truth certificate or null
|
|
236
|
+
*/
|
|
237
|
+
export function loadTruthCertificate(projectDir, runId) {
|
|
238
|
+
const runDir = resolve(projectDir, '.verax', 'runs', runId);
|
|
239
|
+
const certPath = resolve(runDir, 'truth.certificate.json');
|
|
240
|
+
|
|
241
|
+
if (!existsSync(certPath)) {
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
try {
|
|
246
|
+
// @ts-expect-error - readFileSync with encoding returns string
|
|
247
|
+
return JSON.parse(readFileSync(certPath, 'utf-8'));
|
|
248
|
+
} catch {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|