@pactosigna/records 0.1.6 → 0.1.7

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/dist/cli.js CHANGED
@@ -3212,7 +3212,18 @@ var DocumentSignoffStatusResponseSchema = z33.object({
3212
3212
  var DocumentExportResponseSchema = z33.object({
3213
3213
  message: z33.string()
3214
3214
  });
3215
- var CompiledDocumentPresetSchema = z43.enum(["srs", "prs", "dmr", "risk"]);
3215
+ var CompiledDocumentPresetSchema = z43.enum([
3216
+ "srs",
3217
+ "prs",
3218
+ "dmr",
3219
+ "risk",
3220
+ "hld",
3221
+ "sdd",
3222
+ "vv",
3223
+ "uef",
3224
+ "csf",
3225
+ "cer"
3226
+ ]);
3216
3227
  var CompiledDocumentQuerySchema = z43.object({
3217
3228
  organizationId: z43.string().min(1),
3218
3229
  repositoryId: z43.string().min(1).optional(),
@@ -5351,6 +5362,166 @@ function generateSdd(input) {
5351
5362
  });
5352
5363
  }
5353
5364
 
5365
+ // src/generators/vv-generator.ts
5366
+ function generateVv(input) {
5367
+ const protocols = readDocuments(input.rootDir, "docs/test/protocols");
5368
+ const reports = readDocuments(input.rootDir, "docs/test/reports");
5369
+ const plans = readDocuments(input.rootDir, "docs/software/plans").filter(
5370
+ (d) => d.frontmatter.id.startsWith("STP-")
5371
+ );
5372
+ const docs = [...plans, ...protocols, ...reports];
5373
+ if (docs.length === 0) {
5374
+ console.warn("VV: no approved/effective V&V documents found \u2014 skipping");
5375
+ return null;
5376
+ }
5377
+ const content = [];
5378
+ content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
5379
+ content.push({
5380
+ ol: docs.map((d) => ({
5381
+ text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
5382
+ margin: [0, 2, 0, 2]
5383
+ }))
5384
+ });
5385
+ content.push({ text: "", pageBreak: "after" });
5386
+ for (const doc of docs) {
5387
+ content.push({
5388
+ text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
5389
+ style: "h2",
5390
+ margin: [0, 10, 0, 6]
5391
+ });
5392
+ content.push(...markdownToPdfmake(doc.body));
5393
+ content.push({ text: "", margin: [0, 20, 0, 0] });
5394
+ }
5395
+ return buildDocumentDefinition({
5396
+ config: input.config,
5397
+ rootDir: input.rootDir,
5398
+ recordTitle: "Verification & Validation",
5399
+ recordId: "VV",
5400
+ version: input.version,
5401
+ date: input.date,
5402
+ revisionHistory: input.revisionHistory,
5403
+ content
5404
+ });
5405
+ }
5406
+
5407
+ // src/generators/uef-generator.ts
5408
+ function generateUef(input) {
5409
+ const plans = readDocuments(input.rootDir, "docs/usability");
5410
+ const useSpecs = readDocuments(input.rootDir, "docs/usability/use-specifications");
5411
+ const taskAnalyses = readDocuments(input.rootDir, "docs/usability/task-analyses");
5412
+ const evaluations = readDocuments(input.rootDir, "docs/usability/evaluations");
5413
+ const docs = [...plans, ...useSpecs, ...taskAnalyses, ...evaluations];
5414
+ if (docs.length === 0) {
5415
+ console.warn("UEF: no approved/effective usability documents found \u2014 skipping");
5416
+ return null;
5417
+ }
5418
+ const content = [];
5419
+ content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
5420
+ content.push({
5421
+ ol: docs.map((d) => ({
5422
+ text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
5423
+ margin: [0, 2, 0, 2]
5424
+ }))
5425
+ });
5426
+ content.push({ text: "", pageBreak: "after" });
5427
+ for (const doc of docs) {
5428
+ content.push({
5429
+ text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
5430
+ style: "h2",
5431
+ margin: [0, 10, 0, 6]
5432
+ });
5433
+ content.push(...markdownToPdfmake(doc.body));
5434
+ content.push({ text: "", margin: [0, 20, 0, 0] });
5435
+ }
5436
+ return buildDocumentDefinition({
5437
+ config: input.config,
5438
+ rootDir: input.rootDir,
5439
+ recordTitle: "Usability Engineering File",
5440
+ recordId: "UEF",
5441
+ version: input.version,
5442
+ date: input.date,
5443
+ revisionHistory: input.revisionHistory,
5444
+ content
5445
+ });
5446
+ }
5447
+
5448
+ // src/generators/csf-generator.ts
5449
+ function generateCsf(input) {
5450
+ const plans = readDocuments(input.rootDir, "docs/cybersecurity/plans");
5451
+ const risks = readDocuments(input.rootDir, "docs/cybersecurity/risks");
5452
+ const sboms = readDocuments(input.rootDir, "docs/cybersecurity/sbom");
5453
+ const docs = [...plans, ...risks, ...sboms];
5454
+ if (docs.length === 0) {
5455
+ console.warn("CSF: no approved/effective cybersecurity documents found \u2014 skipping");
5456
+ return null;
5457
+ }
5458
+ const content = [];
5459
+ content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
5460
+ content.push({
5461
+ ol: docs.map((d) => ({
5462
+ text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
5463
+ margin: [0, 2, 0, 2]
5464
+ }))
5465
+ });
5466
+ content.push({ text: "", pageBreak: "after" });
5467
+ for (const doc of docs) {
5468
+ content.push({
5469
+ text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
5470
+ style: "h2",
5471
+ margin: [0, 10, 0, 6]
5472
+ });
5473
+ content.push(...markdownToPdfmake(doc.body));
5474
+ content.push({ text: "", margin: [0, 20, 0, 0] });
5475
+ }
5476
+ return buildDocumentDefinition({
5477
+ config: input.config,
5478
+ rootDir: input.rootDir,
5479
+ recordTitle: "Cybersecurity File",
5480
+ recordId: "CSF",
5481
+ version: input.version,
5482
+ date: input.date,
5483
+ revisionHistory: input.revisionHistory,
5484
+ content
5485
+ });
5486
+ }
5487
+
5488
+ // src/generators/cer-generator.ts
5489
+ function generateCer(input) {
5490
+ const docs = readDocuments(input.rootDir, "docs/clinical");
5491
+ if (docs.length === 0) {
5492
+ console.warn("CER: no approved/effective clinical documents found \u2014 skipping");
5493
+ return null;
5494
+ }
5495
+ const content = [];
5496
+ content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
5497
+ content.push({
5498
+ ol: docs.map((d) => ({
5499
+ text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
5500
+ margin: [0, 2, 0, 2]
5501
+ }))
5502
+ });
5503
+ content.push({ text: "", pageBreak: "after" });
5504
+ for (const doc of docs) {
5505
+ content.push({
5506
+ text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
5507
+ style: "h2",
5508
+ margin: [0, 10, 0, 6]
5509
+ });
5510
+ content.push(...markdownToPdfmake(doc.body));
5511
+ content.push({ text: "", margin: [0, 20, 0, 0] });
5512
+ }
5513
+ return buildDocumentDefinition({
5514
+ config: input.config,
5515
+ rootDir: input.rootDir,
5516
+ recordTitle: "Clinical Evaluation Report",
5517
+ recordId: "CER",
5518
+ version: input.version,
5519
+ date: input.date,
5520
+ revisionHistory: input.revisionHistory,
5521
+ content
5522
+ });
5523
+ }
5524
+
5354
5525
  // src/github/changelog.ts
5355
5526
  import { execFileSync } from "child_process";
5356
5527
  import { resolve as resolve5 } from "path";
@@ -5409,7 +5580,11 @@ var RECORD_GENERATORS = [
5409
5580
  { name: "ARC-Software-Architecture-Description", fn: generateArc },
5410
5581
  { name: "SDD-Software-Detailed-Design", fn: generateSdd },
5411
5582
  { name: "PTA-Product-Traceability-Analysis", fn: generatePta },
5412
- { name: "RMR-Risk-Management-Report", fn: generateRmr }
5583
+ { name: "RMR-Risk-Management-Report", fn: generateRmr },
5584
+ { name: "VV-Verification-And-Validation", fn: generateVv },
5585
+ { name: "UEF-Usability-Engineering-File", fn: generateUef },
5586
+ { name: "CSF-Cybersecurity-File", fn: generateCsf },
5587
+ { name: "CER-Clinical-Evaluation-Report", fn: generateCer }
5413
5588
  ];
5414
5589
  var noopUrlResolver = {
5415
5590
  resolve: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkCD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA8C1E"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsCD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA8C1E"}
@@ -0,0 +1,10 @@
1
+ import type { TDocumentDefinitions } from 'pdfmake/interfaces.js';
2
+ import type { GeneratorInput } from './urs-generator.js';
3
+ /**
4
+ * Generate a Clinical Evaluation Report (CER) compiled PDF.
5
+ *
6
+ * Reads clinical evaluation plans and reports.
7
+ * Regulatory basis: MDR Annex XIV
8
+ */
9
+ export declare function generateCer(input: GeneratorInput): TDocumentDefinitions | null;
10
+ //# sourceMappingURL=cer-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cer-generator.d.ts","sourceRoot":"","sources":["../../src/generators/cer-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,GAAG,IAAI,CAyC9E"}
@@ -0,0 +1,10 @@
1
+ import type { TDocumentDefinitions } from 'pdfmake/interfaces.js';
2
+ import type { GeneratorInput } from './urs-generator.js';
3
+ /**
4
+ * Generate a Cybersecurity File (CSF) compiled PDF.
5
+ *
6
+ * Reads cybersecurity plans, SBOMs, and security risk documents.
7
+ * Regulatory basis: IEC 81001-5-1
8
+ */
9
+ export declare function generateCsf(input: GeneratorInput): TDocumentDefinitions | null;
10
+ //# sourceMappingURL=csf-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csf-generator.d.ts","sourceRoot":"","sources":["../../src/generators/csf-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,GAAG,IAAI,CA8C9E"}
@@ -0,0 +1,15 @@
1
+ import type { TDocumentDefinitions } from 'pdfmake/interfaces.js';
2
+ import type { GeneratorInput } from './urs-generator.js';
3
+ /**
4
+ * Generate a Usability Engineering File (UEF) compiled PDF.
5
+ *
6
+ * Reads usability plans, use specifications, task analyses, and evaluations.
7
+ * Regulatory basis: IEC 62366
8
+ *
9
+ * Note: docs/usability/risks (usability_risk type) is intentionally excluded.
10
+ * Per ISO 14971, usability-related risks belong in the Risk Management File (RMF/RMR),
11
+ * not the Usability Engineering File. IEC 62366 §5.9 references risk analysis but
12
+ * delegates the actual risk documentation to ISO 14971.
13
+ */
14
+ export declare function generateUef(input: GeneratorInput): TDocumentDefinitions | null;
15
+ //# sourceMappingURL=uef-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uef-generator.d.ts","sourceRoot":"","sources":["../../src/generators/uef-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,GAAG,IAAI,CA6C9E"}
@@ -0,0 +1,10 @@
1
+ import type { TDocumentDefinitions } from 'pdfmake/interfaces.js';
2
+ import type { GeneratorInput } from './urs-generator.js';
3
+ /**
4
+ * Generate a Verification & Validation (V&V) compiled PDF.
5
+ *
6
+ * Reads test protocols, test reports, and software test plans.
7
+ * Regulatory basis: IEC 62304 Section 5.7
8
+ */
9
+ export declare function generateVv(input: GeneratorInput): TDocumentDefinitions | null;
10
+ //# sourceMappingURL=vv-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vv-generator.d.ts","sourceRoot":"","sources":["../../src/generators/vv-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,GAAG,IAAI,CA8C7E"}
package/dist/index.d.ts CHANGED
@@ -6,6 +6,10 @@ export { generatePrs } from './generators/prs-generator.js';
6
6
  export { generateSrs } from './generators/srs-generator.js';
7
7
  export { generatePta, buildTraceabilityMatrix } from './generators/pta-generator.js';
8
8
  export { generateRmr, buildRiskGraph } from './generators/rmr-generator.js';
9
+ export { generateVv } from './generators/vv-generator.js';
10
+ export { generateUef } from './generators/uef-generator.js';
11
+ export { generateCsf } from './generators/csf-generator.js';
12
+ export { generateCer } from './generators/cer-generator.js';
9
13
  export { loadConfig, RecordsConfigSchema } from './config.js';
10
14
  export type { RecordsConfig } from './config.js';
11
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1193,6 +1193,166 @@ function generateSdd(input) {
1193
1193
  });
1194
1194
  }
1195
1195
 
1196
+ // src/generators/vv-generator.ts
1197
+ function generateVv(input) {
1198
+ const protocols = readDocuments(input.rootDir, "docs/test/protocols");
1199
+ const reports = readDocuments(input.rootDir, "docs/test/reports");
1200
+ const plans = readDocuments(input.rootDir, "docs/software/plans").filter(
1201
+ (d) => d.frontmatter.id.startsWith("STP-")
1202
+ );
1203
+ const docs = [...plans, ...protocols, ...reports];
1204
+ if (docs.length === 0) {
1205
+ console.warn("VV: no approved/effective V&V documents found \u2014 skipping");
1206
+ return null;
1207
+ }
1208
+ const content = [];
1209
+ content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
1210
+ content.push({
1211
+ ol: docs.map((d) => ({
1212
+ text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
1213
+ margin: [0, 2, 0, 2]
1214
+ }))
1215
+ });
1216
+ content.push({ text: "", pageBreak: "after" });
1217
+ for (const doc of docs) {
1218
+ content.push({
1219
+ text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
1220
+ style: "h2",
1221
+ margin: [0, 10, 0, 6]
1222
+ });
1223
+ content.push(...markdownToPdfmake(doc.body));
1224
+ content.push({ text: "", margin: [0, 20, 0, 0] });
1225
+ }
1226
+ return buildDocumentDefinition({
1227
+ config: input.config,
1228
+ rootDir: input.rootDir,
1229
+ recordTitle: "Verification & Validation",
1230
+ recordId: "VV",
1231
+ version: input.version,
1232
+ date: input.date,
1233
+ revisionHistory: input.revisionHistory,
1234
+ content
1235
+ });
1236
+ }
1237
+
1238
+ // src/generators/uef-generator.ts
1239
+ function generateUef(input) {
1240
+ const plans = readDocuments(input.rootDir, "docs/usability");
1241
+ const useSpecs = readDocuments(input.rootDir, "docs/usability/use-specifications");
1242
+ const taskAnalyses = readDocuments(input.rootDir, "docs/usability/task-analyses");
1243
+ const evaluations = readDocuments(input.rootDir, "docs/usability/evaluations");
1244
+ const docs = [...plans, ...useSpecs, ...taskAnalyses, ...evaluations];
1245
+ if (docs.length === 0) {
1246
+ console.warn("UEF: no approved/effective usability documents found \u2014 skipping");
1247
+ return null;
1248
+ }
1249
+ const content = [];
1250
+ content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
1251
+ content.push({
1252
+ ol: docs.map((d) => ({
1253
+ text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
1254
+ margin: [0, 2, 0, 2]
1255
+ }))
1256
+ });
1257
+ content.push({ text: "", pageBreak: "after" });
1258
+ for (const doc of docs) {
1259
+ content.push({
1260
+ text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
1261
+ style: "h2",
1262
+ margin: [0, 10, 0, 6]
1263
+ });
1264
+ content.push(...markdownToPdfmake(doc.body));
1265
+ content.push({ text: "", margin: [0, 20, 0, 0] });
1266
+ }
1267
+ return buildDocumentDefinition({
1268
+ config: input.config,
1269
+ rootDir: input.rootDir,
1270
+ recordTitle: "Usability Engineering File",
1271
+ recordId: "UEF",
1272
+ version: input.version,
1273
+ date: input.date,
1274
+ revisionHistory: input.revisionHistory,
1275
+ content
1276
+ });
1277
+ }
1278
+
1279
+ // src/generators/csf-generator.ts
1280
+ function generateCsf(input) {
1281
+ const plans = readDocuments(input.rootDir, "docs/cybersecurity/plans");
1282
+ const risks = readDocuments(input.rootDir, "docs/cybersecurity/risks");
1283
+ const sboms = readDocuments(input.rootDir, "docs/cybersecurity/sbom");
1284
+ const docs = [...plans, ...risks, ...sboms];
1285
+ if (docs.length === 0) {
1286
+ console.warn("CSF: no approved/effective cybersecurity documents found \u2014 skipping");
1287
+ return null;
1288
+ }
1289
+ const content = [];
1290
+ content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
1291
+ content.push({
1292
+ ol: docs.map((d) => ({
1293
+ text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
1294
+ margin: [0, 2, 0, 2]
1295
+ }))
1296
+ });
1297
+ content.push({ text: "", pageBreak: "after" });
1298
+ for (const doc of docs) {
1299
+ content.push({
1300
+ text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
1301
+ style: "h2",
1302
+ margin: [0, 10, 0, 6]
1303
+ });
1304
+ content.push(...markdownToPdfmake(doc.body));
1305
+ content.push({ text: "", margin: [0, 20, 0, 0] });
1306
+ }
1307
+ return buildDocumentDefinition({
1308
+ config: input.config,
1309
+ rootDir: input.rootDir,
1310
+ recordTitle: "Cybersecurity File",
1311
+ recordId: "CSF",
1312
+ version: input.version,
1313
+ date: input.date,
1314
+ revisionHistory: input.revisionHistory,
1315
+ content
1316
+ });
1317
+ }
1318
+
1319
+ // src/generators/cer-generator.ts
1320
+ function generateCer(input) {
1321
+ const docs = readDocuments(input.rootDir, "docs/clinical");
1322
+ if (docs.length === 0) {
1323
+ console.warn("CER: no approved/effective clinical documents found \u2014 skipping");
1324
+ return null;
1325
+ }
1326
+ const content = [];
1327
+ content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
1328
+ content.push({
1329
+ ol: docs.map((d) => ({
1330
+ text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
1331
+ margin: [0, 2, 0, 2]
1332
+ }))
1333
+ });
1334
+ content.push({ text: "", pageBreak: "after" });
1335
+ for (const doc of docs) {
1336
+ content.push({
1337
+ text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
1338
+ style: "h2",
1339
+ margin: [0, 10, 0, 6]
1340
+ });
1341
+ content.push(...markdownToPdfmake(doc.body));
1342
+ content.push({ text: "", margin: [0, 20, 0, 0] });
1343
+ }
1344
+ return buildDocumentDefinition({
1345
+ config: input.config,
1346
+ rootDir: input.rootDir,
1347
+ recordTitle: "Clinical Evaluation Report",
1348
+ recordId: "CER",
1349
+ version: input.version,
1350
+ date: input.date,
1351
+ revisionHistory: input.revisionHistory,
1352
+ content
1353
+ });
1354
+ }
1355
+
1196
1356
  // src/github/changelog.ts
1197
1357
  import { execFileSync } from "child_process";
1198
1358
  import { resolve as resolve5 } from "path";
@@ -1251,7 +1411,11 @@ var RECORD_GENERATORS = [
1251
1411
  { name: "ARC-Software-Architecture-Description", fn: generateArc },
1252
1412
  { name: "SDD-Software-Detailed-Design", fn: generateSdd },
1253
1413
  { name: "PTA-Product-Traceability-Analysis", fn: generatePta },
1254
- { name: "RMR-Risk-Management-Report", fn: generateRmr }
1414
+ { name: "RMR-Risk-Management-Report", fn: generateRmr },
1415
+ { name: "VV-Verification-And-Validation", fn: generateVv },
1416
+ { name: "UEF-Usability-Engineering-File", fn: generateUef },
1417
+ { name: "CSF-Cybersecurity-File", fn: generateCsf },
1418
+ { name: "CER-Clinical-Evaluation-Report", fn: generateCer }
1255
1419
  ];
1256
1420
  var noopUrlResolver = {
1257
1421
  resolve: () => {
@@ -1313,10 +1477,14 @@ export {
1313
1477
  buildRiskGraph,
1314
1478
  buildTraceabilityMatrix,
1315
1479
  generate,
1480
+ generateCer,
1481
+ generateCsf,
1316
1482
  generatePrs,
1317
1483
  generatePta,
1318
1484
  generateRmr,
1319
1485
  generateSrs,
1486
+ generateUef,
1320
1487
  generateUrs,
1488
+ generateVv,
1321
1489
  loadConfig
1322
1490
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pactosigna/records",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "type": "module",
5
5
  "description": "Generate audit-ready regulatory PDF records from PactoSigna-compliant git repositories",
6
6
  "publishConfig": {