@pactosigna/records 0.1.5 → 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
@@ -2000,7 +2000,11 @@ var RiskGapCodeSchema = z29.enum([
2000
2000
  "architecture_no_risk_analysis",
2001
2001
  "security_hazard_no_asset_ref",
2002
2002
  "high_cia_no_security_hazard",
2003
- "hazard_no_software_item"
2003
+ "hazard_no_software_item",
2004
+ "detailed_design_missing_for_unit",
2005
+ "unit_no_verification",
2006
+ "risk_control_no_verification",
2007
+ "architecture_no_asset_types"
2004
2008
  ]);
2005
2009
  var RiskGapSeveritySchema = z29.enum(["error", "warning"]);
2006
2010
  var MitigationSchema = z29.object({
@@ -3208,7 +3212,18 @@ var DocumentSignoffStatusResponseSchema = z33.object({
3208
3212
  var DocumentExportResponseSchema = z33.object({
3209
3213
  message: z33.string()
3210
3214
  });
3211
- 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
+ ]);
3212
3227
  var CompiledDocumentQuerySchema = z43.object({
3213
3228
  organizationId: z43.string().min(1),
3214
3229
  repositoryId: z43.string().min(1).optional(),
@@ -5347,6 +5362,166 @@ function generateSdd(input) {
5347
5362
  });
5348
5363
  }
5349
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
+
5350
5525
  // src/github/changelog.ts
5351
5526
  import { execFileSync } from "child_process";
5352
5527
  import { resolve as resolve5 } from "path";
@@ -5405,7 +5580,11 @@ var RECORD_GENERATORS = [
5405
5580
  { name: "ARC-Software-Architecture-Description", fn: generateArc },
5406
5581
  { name: "SDD-Software-Detailed-Design", fn: generateSdd },
5407
5582
  { name: "PTA-Product-Traceability-Analysis", fn: generatePta },
5408
- { 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 }
5409
5588
  ];
5410
5589
  var noopUrlResolver = {
5411
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.5",
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": {