@peac/cli 0.10.0 → 0.10.9
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 +78 -5
- package/dist/commands/conformance.d.ts +16 -0
- package/dist/commands/conformance.d.ts.map +1 -0
- package/dist/commands/conformance.js +301 -0
- package/dist/commands/conformance.js.map +1 -0
- package/dist/commands/samples.d.ts +17 -0
- package/dist/commands/samples.d.ts.map +1 -0
- package/dist/commands/samples.js +360 -0
- package/dist/commands/samples.js.map +1 -0
- package/dist/commands/workflow.d.ts +11 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +214 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/index.js +34 -11
- package/dist/index.js.map +1 -1
- package/dist/lib/conformance/digest.d.ts +64 -0
- package/dist/lib/conformance/digest.d.ts.map +1 -0
- package/dist/lib/conformance/digest.js +202 -0
- package/dist/lib/conformance/digest.js.map +1 -0
- package/dist/lib/conformance/index.d.ts +11 -0
- package/dist/lib/conformance/index.d.ts.map +1 -0
- package/dist/lib/conformance/index.js +30 -0
- package/dist/lib/conformance/index.js.map +1 -0
- package/dist/lib/conformance/manifest.d.ts +15 -0
- package/dist/lib/conformance/manifest.d.ts.map +1 -0
- package/dist/lib/conformance/manifest.js +66 -0
- package/dist/lib/conformance/manifest.js.map +1 -0
- package/dist/lib/conformance/profiles.d.ts +33 -0
- package/dist/lib/conformance/profiles.d.ts.map +1 -0
- package/dist/lib/conformance/profiles.js +138 -0
- package/dist/lib/conformance/profiles.js.map +1 -0
- package/dist/lib/conformance/types.d.ts +186 -0
- package/dist/lib/conformance/types.d.ts.map +1 -0
- package/dist/lib/conformance/types.js +8 -0
- package/dist/lib/conformance/types.js.map +1 -0
- package/dist/lib/conformance/validators.d.ts +27 -0
- package/dist/lib/conformance/validators.d.ts.map +1 -0
- package/dist/lib/conformance/validators.js +415 -0
- package/dist/lib/conformance/validators.js.map +1 -0
- package/dist/lib/conformance-runner.d.ts +29 -0
- package/dist/lib/conformance-runner.d.ts.map +1 -0
- package/dist/lib/conformance-runner.js +433 -0
- package/dist/lib/conformance-runner.js.map +1 -0
- package/dist/lib/samples-loader.d.ts +44 -0
- package/dist/lib/samples-loader.d.ts.map +1 -0
- package/dist/lib/samples-loader.js +311 -0
- package/dist/lib/samples-loader.js.map +1 -0
- package/dist/lib/version.d.ts +22 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +61 -0
- package/dist/lib/version.js.map +1 -0
- package/package.json +17 -8
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PEAC Conformance Runner Library
|
|
4
|
+
*
|
|
5
|
+
* Category-aware validation using the same validators as tests/conformance/*.spec.ts:
|
|
6
|
+
* - Receipt validation via @peac/schema (ReceiptClaimsSchema)
|
|
7
|
+
* - Discovery validation via @peac/disc (parse, validate)
|
|
8
|
+
* - Bundle verification via @peac/audit (verifyBundleIntegrity)
|
|
9
|
+
* - Attestation validation via @peac/schema validators
|
|
10
|
+
* - Interaction/Workflow validation via ordered validators
|
|
11
|
+
*
|
|
12
|
+
* This is the CLI's thin wrapper around the conformance suite.
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.zodPathToJsonPointer = void 0;
|
|
49
|
+
exports.runConformance = runConformance;
|
|
50
|
+
exports.formatReportText = formatReportText;
|
|
51
|
+
exports.formatReportMarkdown = formatReportMarkdown;
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
const child_process_1 = require("child_process");
|
|
55
|
+
var digest_js_1 = require("./conformance/digest.js");
|
|
56
|
+
Object.defineProperty(exports, "zodPathToJsonPointer", { enumerable: true, get: function () { return digest_js_1.zodPathToJsonPointer; } });
|
|
57
|
+
const manifest_js_1 = require("./conformance/manifest.js");
|
|
58
|
+
const digest_js_2 = require("./conformance/digest.js");
|
|
59
|
+
const profiles_js_1 = require("./conformance/profiles.js");
|
|
60
|
+
const validators_js_1 = require("./conformance/validators.js");
|
|
61
|
+
function getGitSha() {
|
|
62
|
+
try {
|
|
63
|
+
return (0, child_process_1.execSync)('git rev-parse --short HEAD', { encoding: 'utf-8' }).trim();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Run conformance tests and generate report
|
|
71
|
+
* Pure function - no console output, uses callbacks for progress
|
|
72
|
+
*/
|
|
73
|
+
function runConformance(options, callbacks) {
|
|
74
|
+
const startTime = Date.now();
|
|
75
|
+
const { fixturesDir, level, category, implementationName, implementationVersion } = options;
|
|
76
|
+
// Load manifest for reason checking
|
|
77
|
+
const manifest = (0, manifest_js_1.loadManifest)(fixturesDir);
|
|
78
|
+
// Collect categories to test (SORTED for determinism)
|
|
79
|
+
const entries = fs.readdirSync(fixturesDir, { withFileTypes: true });
|
|
80
|
+
let categories = entries
|
|
81
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith('.'))
|
|
82
|
+
.map((e) => e.name)
|
|
83
|
+
.sort(); // Deterministic ordering
|
|
84
|
+
if (category) {
|
|
85
|
+
if (!categories.includes(category)) {
|
|
86
|
+
throw new Error(`Category not found: ${category}`);
|
|
87
|
+
}
|
|
88
|
+
categories = [category];
|
|
89
|
+
}
|
|
90
|
+
// Compute comprehensive vectors digest (includes manifest.json, recursive)
|
|
91
|
+
const vectorsDigest = (0, digest_js_2.computeVectorsDigest)(fixturesDir, categories);
|
|
92
|
+
// Collect profiles
|
|
93
|
+
const profiles = new Set();
|
|
94
|
+
// Run tests
|
|
95
|
+
const results = [];
|
|
96
|
+
let passed = 0;
|
|
97
|
+
let failed = 0;
|
|
98
|
+
let skipped = 0;
|
|
99
|
+
for (const cat of categories) {
|
|
100
|
+
const categoryPath = path.join(fixturesDir, cat);
|
|
101
|
+
const profile = (0, profiles_js_1.getCategoryProfile)(cat);
|
|
102
|
+
profiles.add(profile);
|
|
103
|
+
const validator = (0, validators_js_1.getValidator)(cat);
|
|
104
|
+
// SORTED for deterministic ordering across OS/filesystems
|
|
105
|
+
const files = fs
|
|
106
|
+
.readdirSync(categoryPath)
|
|
107
|
+
.filter((f) => f.endsWith('.json'))
|
|
108
|
+
.sort();
|
|
109
|
+
for (const file of files) {
|
|
110
|
+
const filePath = path.join(categoryPath, file);
|
|
111
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
112
|
+
let fixture;
|
|
113
|
+
const baseTestId = `${cat}.${file.replace('.json', '')}`;
|
|
114
|
+
callbacks?.onTestStart?.(baseTestId);
|
|
115
|
+
try {
|
|
116
|
+
fixture = JSON.parse(content);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
// Invalid JSON is a test failure
|
|
120
|
+
failed++;
|
|
121
|
+
const result = {
|
|
122
|
+
id: `${baseTestId}.parse`,
|
|
123
|
+
category: profile,
|
|
124
|
+
status: 'fail',
|
|
125
|
+
observed: {
|
|
126
|
+
valid: false,
|
|
127
|
+
error_code: 'E_INVALID_JSON',
|
|
128
|
+
error_message: err.message,
|
|
129
|
+
},
|
|
130
|
+
diagnostics: {
|
|
131
|
+
error_code: 'E_INVALID_JSON',
|
|
132
|
+
error_message: err.message,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
results.push(result);
|
|
136
|
+
callbacks?.onTestComplete?.(result);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
// Determine if this is a fixture pack or single fixture
|
|
140
|
+
const fixtureObj = fixture;
|
|
141
|
+
const isFixturePack = Array.isArray(fixtureObj.fixtures);
|
|
142
|
+
if (isFixturePack) {
|
|
143
|
+
// Process fixture pack
|
|
144
|
+
const pack = fixture;
|
|
145
|
+
if (!(0, profiles_js_1.shouldRunAtLevel)(pack.version, level)) {
|
|
146
|
+
skipped++;
|
|
147
|
+
const result = {
|
|
148
|
+
id: baseTestId,
|
|
149
|
+
category: profile,
|
|
150
|
+
status: 'skip',
|
|
151
|
+
diagnostics: {
|
|
152
|
+
skip_reason: `Fixture version ${pack.version} exceeds level ${level}`,
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
results.push(result);
|
|
156
|
+
callbacks?.onTestComplete?.(result);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
for (let i = 0; i < pack.fixtures.length; i++) {
|
|
160
|
+
const f = pack.fixtures[i];
|
|
161
|
+
const fixtureName = f.name ?? `fixture_${i}`;
|
|
162
|
+
const testId = `${baseTestId}.${fixtureName.replace(/\s+/g, '_')}`;
|
|
163
|
+
// Use JCS for canonical input digest (returns {alg, value})
|
|
164
|
+
const inputDigest = (0, digest_js_2.computeCanonicalDigest)(f.input);
|
|
165
|
+
callbacks?.onTestStart?.(testId);
|
|
166
|
+
// Guard: fixture inputs must not have both "claims" and "payload".
|
|
167
|
+
// Ambiguity is a test-harness concern -- precedence would silently
|
|
168
|
+
// pick one and hide fixture authoring bugs.
|
|
169
|
+
if (typeof f.input === 'object' && f.input !== null) {
|
|
170
|
+
const inputObj = f.input;
|
|
171
|
+
if (inputObj.claims !== undefined && inputObj.payload !== undefined) {
|
|
172
|
+
failed++;
|
|
173
|
+
const result = {
|
|
174
|
+
id: testId,
|
|
175
|
+
category: profile,
|
|
176
|
+
status: 'fail',
|
|
177
|
+
diagnostics: {
|
|
178
|
+
error_message: 'Fixture has both "claims" and "payload" -- ambiguous; use one',
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
results.push(result);
|
|
182
|
+
callbacks?.onTestComplete?.(result);
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const observed = validator(f.input);
|
|
187
|
+
// Check if result matches expectation
|
|
188
|
+
const expectedValid = f.expected.valid;
|
|
189
|
+
const actualValid = observed.valid;
|
|
190
|
+
const expectedError = f.expected.error_code ?? f.expected.error;
|
|
191
|
+
const actualError = observed.error_code;
|
|
192
|
+
let status;
|
|
193
|
+
if (expectedValid && actualValid) {
|
|
194
|
+
status = 'pass';
|
|
195
|
+
passed++;
|
|
196
|
+
}
|
|
197
|
+
else if (!expectedValid && !actualValid) {
|
|
198
|
+
// Both invalid - check if error codes match (if specified)
|
|
199
|
+
if (expectedError && actualError && expectedError !== actualError) {
|
|
200
|
+
status = 'fail';
|
|
201
|
+
failed++;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
status = 'pass';
|
|
205
|
+
passed++;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
status = 'fail';
|
|
210
|
+
failed++;
|
|
211
|
+
}
|
|
212
|
+
const result = {
|
|
213
|
+
id: testId,
|
|
214
|
+
category: profile,
|
|
215
|
+
status,
|
|
216
|
+
expected: {
|
|
217
|
+
valid: expectedValid,
|
|
218
|
+
error_code: expectedError,
|
|
219
|
+
},
|
|
220
|
+
observed: {
|
|
221
|
+
valid: actualValid,
|
|
222
|
+
error_code: actualError,
|
|
223
|
+
error_message: observed.error_message,
|
|
224
|
+
},
|
|
225
|
+
diagnostics: {
|
|
226
|
+
input_digest: inputDigest,
|
|
227
|
+
warnings: observed.warnings,
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
results.push(result);
|
|
231
|
+
callbacks?.onTestComplete?.(result);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
// Process single fixture
|
|
236
|
+
const singleFixture = fixture;
|
|
237
|
+
const testId = baseTestId;
|
|
238
|
+
// Get manifest entry for additional expectations
|
|
239
|
+
const manifestEntry = (0, manifest_js_1.getManifestEntry)(manifest, cat, file);
|
|
240
|
+
// Use JCS for payload if present, otherwise hash raw file content for single fixtures
|
|
241
|
+
const inputToValidate = singleFixture.payload ?? fixture;
|
|
242
|
+
const inputDigest = singleFixture.payload
|
|
243
|
+
? (0, digest_js_2.computeCanonicalDigest)(inputToValidate)
|
|
244
|
+
: { alg: 'sha-256', value: (0, digest_js_2.sha256)(content) }; // Raw file hash for single fixtures without payload
|
|
245
|
+
// Determine expected validity from (in order): fixture, manifest, category default
|
|
246
|
+
const expectedValid = singleFixture.expected_valid ??
|
|
247
|
+
manifestEntry?.expected_valid ??
|
|
248
|
+
(cat === 'valid' || cat === 'edge');
|
|
249
|
+
// Get expected error from fixture or manifest (never derived from keyword)
|
|
250
|
+
const expectedError = singleFixture.expected_error ?? manifestEntry?.expected_error_code;
|
|
251
|
+
// Get expected path and keyword from manifest (first-class assertions)
|
|
252
|
+
const expectedPath = manifestEntry?.expected_path;
|
|
253
|
+
const expectedKeyword = manifestEntry?.expected_keyword;
|
|
254
|
+
const observed = validator(inputToValidate);
|
|
255
|
+
let status;
|
|
256
|
+
if (expectedValid && observed.valid) {
|
|
257
|
+
status = 'pass';
|
|
258
|
+
passed++;
|
|
259
|
+
}
|
|
260
|
+
else if (!expectedValid && !observed.valid) {
|
|
261
|
+
// Both invalid - check if error codes match (if specified)
|
|
262
|
+
let mismatch = false;
|
|
263
|
+
if (expectedError && observed.error_code && expectedError !== observed.error_code) {
|
|
264
|
+
mismatch = true;
|
|
265
|
+
}
|
|
266
|
+
// Check expected_path if specified (first-class assertion)
|
|
267
|
+
if (expectedPath && observed.error_path && expectedPath !== observed.error_path) {
|
|
268
|
+
mismatch = true;
|
|
269
|
+
}
|
|
270
|
+
// Check expected_keyword if specified (first-class assertion)
|
|
271
|
+
if (expectedKeyword &&
|
|
272
|
+
observed.error_keyword &&
|
|
273
|
+
expectedKeyword !== observed.error_keyword) {
|
|
274
|
+
mismatch = true;
|
|
275
|
+
}
|
|
276
|
+
if (mismatch) {
|
|
277
|
+
status = 'fail';
|
|
278
|
+
failed++;
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
status = 'pass';
|
|
282
|
+
passed++;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
status = 'fail';
|
|
287
|
+
failed++;
|
|
288
|
+
}
|
|
289
|
+
const result = {
|
|
290
|
+
id: testId,
|
|
291
|
+
category: profile,
|
|
292
|
+
status,
|
|
293
|
+
expected: {
|
|
294
|
+
valid: expectedValid,
|
|
295
|
+
error_code: expectedError,
|
|
296
|
+
error_path: expectedPath,
|
|
297
|
+
error_keyword: expectedKeyword,
|
|
298
|
+
},
|
|
299
|
+
observed: {
|
|
300
|
+
valid: observed.valid,
|
|
301
|
+
error_code: observed.error_code,
|
|
302
|
+
error_path: observed.error_path,
|
|
303
|
+
error_keyword: observed.error_keyword,
|
|
304
|
+
error_message: observed.error_message,
|
|
305
|
+
},
|
|
306
|
+
diagnostics: {
|
|
307
|
+
input_digest: inputDigest,
|
|
308
|
+
warnings: observed.warnings,
|
|
309
|
+
},
|
|
310
|
+
};
|
|
311
|
+
results.push(result);
|
|
312
|
+
callbacks?.onTestComplete?.(result);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Build capabilities from tested categories
|
|
317
|
+
const capabilities = [];
|
|
318
|
+
for (const cat of categories) {
|
|
319
|
+
const capability = (0, profiles_js_1.getCategoryCapability)(cat);
|
|
320
|
+
// Deduplicate by profile name
|
|
321
|
+
if (!capabilities.some((c) => c.profile === capability.profile)) {
|
|
322
|
+
capabilities.push(capability);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
capabilities.sort((a, b) => a.profile.localeCompare(b.profile));
|
|
326
|
+
const endTime = Date.now();
|
|
327
|
+
// Build report
|
|
328
|
+
const report = {
|
|
329
|
+
report_version: 'peac-conformance-report/0.1',
|
|
330
|
+
suite: {
|
|
331
|
+
name: 'peac-core-conformance',
|
|
332
|
+
version: '0.1.0',
|
|
333
|
+
vectors_digest: {
|
|
334
|
+
alg: 'sha-256',
|
|
335
|
+
value: vectorsDigest,
|
|
336
|
+
},
|
|
337
|
+
profiles: Array.from(profiles).sort(),
|
|
338
|
+
capabilities,
|
|
339
|
+
},
|
|
340
|
+
implementation: {
|
|
341
|
+
name: implementationName ?? '@peac/cli',
|
|
342
|
+
version: implementationVersion ?? '0.0.0',
|
|
343
|
+
},
|
|
344
|
+
summary: {
|
|
345
|
+
passed,
|
|
346
|
+
failed,
|
|
347
|
+
skipped,
|
|
348
|
+
total: passed + failed + skipped,
|
|
349
|
+
status: failed === 0 ? 'pass' : 'fail',
|
|
350
|
+
},
|
|
351
|
+
results,
|
|
352
|
+
meta: {
|
|
353
|
+
generated_at: new Date().toISOString(),
|
|
354
|
+
duration_ms: endTime - startTime,
|
|
355
|
+
runner: {
|
|
356
|
+
name: '@peac/cli',
|
|
357
|
+
version: implementationVersion ?? '0.0.0',
|
|
358
|
+
git_sha: getGitSha(),
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
return report;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Format report as text
|
|
366
|
+
*/
|
|
367
|
+
function formatReportText(report) {
|
|
368
|
+
const lines = [];
|
|
369
|
+
lines.push('PEAC Conformance Test Results');
|
|
370
|
+
lines.push('=============================');
|
|
371
|
+
lines.push('');
|
|
372
|
+
lines.push(`Status: ${report.summary.status.toUpperCase()}`);
|
|
373
|
+
lines.push(`Profiles: ${report.suite.profiles.join(', ')}`);
|
|
374
|
+
lines.push('');
|
|
375
|
+
lines.push('Summary:');
|
|
376
|
+
lines.push(` Passed: ${report.summary.passed}`);
|
|
377
|
+
lines.push(` Failed: ${report.summary.failed}`);
|
|
378
|
+
lines.push(` Skipped: ${report.summary.skipped}`);
|
|
379
|
+
lines.push(` Total: ${report.summary.total}`);
|
|
380
|
+
const failures = report.results.filter((r) => r.status === 'fail');
|
|
381
|
+
if (failures.length > 0) {
|
|
382
|
+
lines.push('');
|
|
383
|
+
lines.push('Failures:');
|
|
384
|
+
for (const f of failures) {
|
|
385
|
+
lines.push(` - ${f.id}`);
|
|
386
|
+
if (f.expected) {
|
|
387
|
+
lines.push(` Expected: valid=${f.expected.valid}${f.expected.error_code ? `, error=${f.expected.error_code}` : ''}`);
|
|
388
|
+
}
|
|
389
|
+
if (f.observed) {
|
|
390
|
+
lines.push(` Observed: valid=${f.observed.valid}${f.observed.error_code ? `, error=${f.observed.error_code}` : ''}`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return lines.join('\n');
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Format report as markdown
|
|
398
|
+
*/
|
|
399
|
+
function formatReportMarkdown(report) {
|
|
400
|
+
const lines = [];
|
|
401
|
+
lines.push('# PEAC Conformance Report');
|
|
402
|
+
lines.push('');
|
|
403
|
+
lines.push(`**Status:** ${report.summary.status.toUpperCase()}`);
|
|
404
|
+
lines.push(`**Profiles:** ${report.suite.profiles.join(', ')}`);
|
|
405
|
+
lines.push('');
|
|
406
|
+
lines.push('## Summary');
|
|
407
|
+
lines.push('');
|
|
408
|
+
lines.push('| Metric | Count |');
|
|
409
|
+
lines.push('|--------|-------|');
|
|
410
|
+
lines.push(`| Passed | ${report.summary.passed} |`);
|
|
411
|
+
lines.push(`| Failed | ${report.summary.failed} |`);
|
|
412
|
+
lines.push(`| Skipped | ${report.summary.skipped} |`);
|
|
413
|
+
lines.push(`| Total | ${report.summary.total} |`);
|
|
414
|
+
const failures = report.results.filter((r) => r.status === 'fail');
|
|
415
|
+
if (failures.length > 0) {
|
|
416
|
+
lines.push('');
|
|
417
|
+
lines.push('## Failures');
|
|
418
|
+
lines.push('');
|
|
419
|
+
for (const f of failures) {
|
|
420
|
+
lines.push(`### ${f.id}`);
|
|
421
|
+
lines.push('');
|
|
422
|
+
if (f.expected) {
|
|
423
|
+
lines.push(`- **Expected:** valid=${f.expected.valid}${f.expected.error_code ? `, error=${f.expected.error_code}` : ''}`);
|
|
424
|
+
}
|
|
425
|
+
if (f.observed) {
|
|
426
|
+
lines.push(`- **Observed:** valid=${f.observed.valid}${f.observed.error_code ? `, error=${f.observed.error_code}` : ''}`);
|
|
427
|
+
}
|
|
428
|
+
lines.push('');
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return lines.join('\n');
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=conformance-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance-runner.js","sourceRoot":"","sources":["../../src/lib/conformance-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PEAC Samples Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads sample definitions from specs/conformance/samples/ when available,
|
|
5
|
+
* falling back to embedded defaults when running outside the repo.
|
|
6
|
+
*
|
|
7
|
+
* This ensures a single source of truth (specs folder is canonical).
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Sample category
|
|
11
|
+
*/
|
|
12
|
+
export type SampleCategory = 'valid' | 'invalid' | 'edge';
|
|
13
|
+
/**
|
|
14
|
+
* Sample definition
|
|
15
|
+
*/
|
|
16
|
+
export interface SampleDefinition {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
category: SampleCategory;
|
|
21
|
+
claims: Record<string, unknown>;
|
|
22
|
+
header?: Record<string, unknown>;
|
|
23
|
+
expectedError?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Find samples directory
|
|
27
|
+
*/
|
|
28
|
+
export declare function findSamplesDir(customPath?: string): string | null;
|
|
29
|
+
/**
|
|
30
|
+
* Get sample definitions
|
|
31
|
+
*
|
|
32
|
+
* Loads from specs/conformance/samples/ when available (canonical source),
|
|
33
|
+
* falls back to embedded samples when running outside the repo.
|
|
34
|
+
*/
|
|
35
|
+
export declare function getSamples(customSamplesPath?: string): SampleDefinition[];
|
|
36
|
+
/**
|
|
37
|
+
* Get a specific sample by ID
|
|
38
|
+
*/
|
|
39
|
+
export declare function getSampleById(id: string, customSamplesPath?: string): SampleDefinition | null;
|
|
40
|
+
/**
|
|
41
|
+
* List available sample IDs by category
|
|
42
|
+
*/
|
|
43
|
+
export declare function listSampleIds(category?: SampleCategory, customSamplesPath?: string): string[];
|
|
44
|
+
//# sourceMappingURL=samples-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"samples-loader.d.ts","sourceRoot":"","sources":["../../src/lib/samples-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA0ID;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4BjE;AA4ED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAYzE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAG7F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAI7F"}
|