verification-layer 0.20.0 → 0.22.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 (180) hide show
  1. package/README.md +251 -615
  2. package/dist/cli.js +542 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/marketplace/index.d.ts +8 -0
  5. package/dist/marketplace/index.d.ts.map +1 -0
  6. package/dist/marketplace/index.js +7 -0
  7. package/dist/marketplace/index.js.map +1 -0
  8. package/dist/marketplace/installer.d.ts +62 -0
  9. package/dist/marketplace/installer.d.ts.map +1 -0
  10. package/dist/marketplace/installer.js +254 -0
  11. package/dist/marketplace/installer.js.map +1 -0
  12. package/dist/marketplace/registry.d.ts +52 -0
  13. package/dist/marketplace/registry.d.ts.map +1 -0
  14. package/dist/marketplace/registry.js +759 -0
  15. package/dist/marketplace/registry.js.map +1 -0
  16. package/dist/marketplace/types.d.ts +123 -0
  17. package/dist/marketplace/types.d.ts.map +1 -0
  18. package/dist/marketplace/types.js +6 -0
  19. package/dist/marketplace/types.js.map +1 -0
  20. package/dist/reporters/audit-report.d.ts.map +1 -1
  21. package/dist/reporters/audit-report.js +180 -0
  22. package/dist/reporters/audit-report.js.map +1 -1
  23. package/dist/reporters/index.d.ts.map +1 -1
  24. package/dist/reporters/index.js +2612 -5
  25. package/dist/reporters/index.js.map +1 -1
  26. package/dist/scan.d.ts.map +1 -1
  27. package/dist/scan.js +15 -1
  28. package/dist/scan.js.map +1 -1
  29. package/dist/scanners/api-security/index.d.ts +7 -0
  30. package/dist/scanners/api-security/index.d.ts.map +1 -0
  31. package/dist/scanners/api-security/index.js +139 -0
  32. package/dist/scanners/api-security/index.js.map +1 -0
  33. package/dist/scanners/api-security/index.test.d.ts +5 -0
  34. package/dist/scanners/api-security/index.test.d.ts.map +1 -0
  35. package/dist/scanners/api-security/index.test.js +360 -0
  36. package/dist/scanners/api-security/index.test.js.map +1 -0
  37. package/dist/scanners/api-security/patterns.d.ts +32 -0
  38. package/dist/scanners/api-security/patterns.d.ts.map +1 -0
  39. package/dist/scanners/api-security/patterns.js +159 -0
  40. package/dist/scanners/api-security/patterns.js.map +1 -0
  41. package/dist/scanners/authentication/index.d.ts +7 -0
  42. package/dist/scanners/authentication/index.d.ts.map +1 -0
  43. package/dist/scanners/authentication/index.js +107 -0
  44. package/dist/scanners/authentication/index.js.map +1 -0
  45. package/dist/scanners/authentication/index.test.d.ts +5 -0
  46. package/dist/scanners/authentication/index.test.d.ts.map +1 -0
  47. package/dist/scanners/authentication/index.test.js +379 -0
  48. package/dist/scanners/authentication/index.test.js.map +1 -0
  49. package/dist/scanners/authentication/patterns.d.ts +32 -0
  50. package/dist/scanners/authentication/patterns.d.ts.map +1 -0
  51. package/dist/scanners/authentication/patterns.js +133 -0
  52. package/dist/scanners/authentication/patterns.js.map +1 -0
  53. package/dist/scanners/configuration/index.d.ts +8 -0
  54. package/dist/scanners/configuration/index.d.ts.map +1 -0
  55. package/dist/scanners/configuration/index.js +87 -0
  56. package/dist/scanners/configuration/index.js.map +1 -0
  57. package/dist/scanners/configuration/index.test.d.ts +5 -0
  58. package/dist/scanners/configuration/index.test.d.ts.map +1 -0
  59. package/dist/scanners/configuration/index.test.js +344 -0
  60. package/dist/scanners/configuration/index.test.js.map +1 -0
  61. package/dist/scanners/configuration/patterns.d.ts +32 -0
  62. package/dist/scanners/configuration/patterns.d.ts.map +1 -0
  63. package/dist/scanners/configuration/patterns.js +146 -0
  64. package/dist/scanners/configuration/patterns.js.map +1 -0
  65. package/dist/scanners/credentials/index.d.ts +7 -0
  66. package/dist/scanners/credentials/index.d.ts.map +1 -0
  67. package/dist/scanners/credentials/index.js +129 -0
  68. package/dist/scanners/credentials/index.js.map +1 -0
  69. package/dist/scanners/credentials/index.test.d.ts +5 -0
  70. package/dist/scanners/credentials/index.test.d.ts.map +1 -0
  71. package/dist/scanners/credentials/index.test.js +395 -0
  72. package/dist/scanners/credentials/index.test.js.map +1 -0
  73. package/dist/scanners/credentials/patterns.d.ts +32 -0
  74. package/dist/scanners/credentials/patterns.d.ts.map +1 -0
  75. package/dist/scanners/credentials/patterns.js +140 -0
  76. package/dist/scanners/credentials/patterns.js.map +1 -0
  77. package/dist/scanners/errors/index.d.ts +8 -0
  78. package/dist/scanners/errors/index.d.ts.map +1 -0
  79. package/dist/scanners/errors/index.js +78 -0
  80. package/dist/scanners/errors/index.js.map +1 -0
  81. package/dist/scanners/errors/index.test.d.ts +5 -0
  82. package/dist/scanners/errors/index.test.d.ts.map +1 -0
  83. package/dist/scanners/errors/index.test.js +330 -0
  84. package/dist/scanners/errors/index.test.js.map +1 -0
  85. package/dist/scanners/errors/patterns.d.ts +27 -0
  86. package/dist/scanners/errors/patterns.d.ts.map +1 -0
  87. package/dist/scanners/errors/patterns.js +97 -0
  88. package/dist/scanners/errors/patterns.js.map +1 -0
  89. package/dist/scanners/hipaa2026/index.d.ts +8 -0
  90. package/dist/scanners/hipaa2026/index.d.ts.map +1 -0
  91. package/dist/scanners/hipaa2026/index.js +345 -0
  92. package/dist/scanners/hipaa2026/index.js.map +1 -0
  93. package/dist/scanners/hipaa2026/index.test.d.ts +5 -0
  94. package/dist/scanners/hipaa2026/index.test.d.ts.map +1 -0
  95. package/dist/scanners/hipaa2026/index.test.js +332 -0
  96. package/dist/scanners/hipaa2026/index.test.js.map +1 -0
  97. package/dist/scanners/hipaa2026/patterns.d.ts +57 -0
  98. package/dist/scanners/hipaa2026/patterns.d.ts.map +1 -0
  99. package/dist/scanners/hipaa2026/patterns.js +268 -0
  100. package/dist/scanners/hipaa2026/patterns.js.map +1 -0
  101. package/dist/scanners/operational/index.d.ts +7 -0
  102. package/dist/scanners/operational/index.d.ts.map +1 -0
  103. package/dist/scanners/operational/index.js +171 -0
  104. package/dist/scanners/operational/index.js.map +1 -0
  105. package/dist/scanners/operational/index.test.d.ts +5 -0
  106. package/dist/scanners/operational/index.test.d.ts.map +1 -0
  107. package/dist/scanners/operational/index.test.js +406 -0
  108. package/dist/scanners/operational/index.test.js.map +1 -0
  109. package/dist/scanners/operational/patterns.d.ts +33 -0
  110. package/dist/scanners/operational/patterns.d.ts.map +1 -0
  111. package/dist/scanners/operational/patterns.js +151 -0
  112. package/dist/scanners/operational/patterns.js.map +1 -0
  113. package/dist/scanners/rbac/index.d.ts +7 -0
  114. package/dist/scanners/rbac/index.d.ts.map +1 -0
  115. package/dist/scanners/rbac/index.js +145 -0
  116. package/dist/scanners/rbac/index.js.map +1 -0
  117. package/dist/scanners/rbac/index.test.d.ts +5 -0
  118. package/dist/scanners/rbac/index.test.d.ts.map +1 -0
  119. package/dist/scanners/rbac/index.test.js +422 -0
  120. package/dist/scanners/rbac/index.test.js.map +1 -0
  121. package/dist/scanners/rbac/patterns.d.ts +32 -0
  122. package/dist/scanners/rbac/patterns.d.ts.map +1 -0
  123. package/dist/scanners/rbac/patterns.js +124 -0
  124. package/dist/scanners/rbac/patterns.js.map +1 -0
  125. package/dist/scanners/revocation/index.d.ts +8 -0
  126. package/dist/scanners/revocation/index.d.ts.map +1 -0
  127. package/dist/scanners/revocation/index.js +83 -0
  128. package/dist/scanners/revocation/index.js.map +1 -0
  129. package/dist/scanners/revocation/index.test.d.ts +5 -0
  130. package/dist/scanners/revocation/index.test.d.ts.map +1 -0
  131. package/dist/scanners/revocation/index.test.js +332 -0
  132. package/dist/scanners/revocation/index.test.js.map +1 -0
  133. package/dist/scanners/revocation/patterns.d.ts +27 -0
  134. package/dist/scanners/revocation/patterns.d.ts.map +1 -0
  135. package/dist/scanners/revocation/patterns.js +109 -0
  136. package/dist/scanners/revocation/patterns.js.map +1 -0
  137. package/dist/scanners/sanitization/index.d.ts +8 -0
  138. package/dist/scanners/sanitization/index.d.ts.map +1 -0
  139. package/dist/scanners/sanitization/index.js +98 -0
  140. package/dist/scanners/sanitization/index.js.map +1 -0
  141. package/dist/scanners/sanitization/index.test.d.ts +5 -0
  142. package/dist/scanners/sanitization/index.test.d.ts.map +1 -0
  143. package/dist/scanners/sanitization/index.test.js +370 -0
  144. package/dist/scanners/sanitization/index.test.js.map +1 -0
  145. package/dist/scanners/sanitization/patterns.d.ts +27 -0
  146. package/dist/scanners/sanitization/patterns.d.ts.map +1 -0
  147. package/dist/scanners/sanitization/patterns.js +117 -0
  148. package/dist/scanners/sanitization/patterns.js.map +1 -0
  149. package/dist/training/certificate.d.ts +26 -0
  150. package/dist/training/certificate.d.ts.map +1 -0
  151. package/dist/training/certificate.js +92 -0
  152. package/dist/training/certificate.js.map +1 -0
  153. package/dist/training/index.d.ts +3 -0
  154. package/dist/training/index.d.ts.map +1 -0
  155. package/dist/training/index.js +243 -0
  156. package/dist/training/index.js.map +1 -0
  157. package/dist/training/modules.d.ts +13 -0
  158. package/dist/training/modules.d.ts.map +1 -0
  159. package/dist/training/modules.js +608 -0
  160. package/dist/training/modules.js.map +1 -0
  161. package/dist/training/questions.d.ts +9 -0
  162. package/dist/training/questions.d.ts.map +1 -0
  163. package/dist/training/questions.js +505 -0
  164. package/dist/training/questions.js.map +1 -0
  165. package/dist/types.d.ts +45 -0
  166. package/dist/types.d.ts.map +1 -1
  167. package/dist/utils/npm-audit.d.ts +6 -0
  168. package/dist/utils/npm-audit.d.ts.map +1 -0
  169. package/dist/utils/npm-audit.js +95 -0
  170. package/dist/utils/npm-audit.js.map +1 -0
  171. package/dist/utils/scan-history.d.ts +59 -0
  172. package/dist/utils/scan-history.d.ts.map +1 -0
  173. package/dist/utils/scan-history.js +170 -0
  174. package/dist/utils/scan-history.js.map +1 -0
  175. package/package.json +4 -1
  176. package/templates/baa-verification-letter.md +105 -0
  177. package/templates/irp.md +545 -0
  178. package/templates/notice-of-privacy-practices.md +491 -0
  179. package/templates/physical-safeguards-checklist.md +247 -0
  180. package/templates/security-officer-designation.md +237 -0
@@ -0,0 +1,345 @@
1
+ /**
2
+ * HIPAA 2026 Security Rule Scanner
3
+ * Implements detection for 15 technical requirements (all now "required")
4
+ * Expected enforcement: May 2026
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import { ALL_HIPAA_2026_PATTERNS, } from './patterns.js';
9
+ /**
10
+ * Generate asset inventory for ePHI systems
11
+ */
12
+ async function generateAssetInventory(file, content, lines) {
13
+ const assets = [];
14
+ for (let i = 0; i < lines.length; i++) {
15
+ const line = lines[i];
16
+ // Database assets
17
+ if (/(?:mongoose|sequelize|prisma|typeorm)\.(?:connect|model)/i.test(line)) {
18
+ assets.push({
19
+ type: 'database',
20
+ name: extractAssetName(line, 'database'),
21
+ file,
22
+ line: i + 1,
23
+ processesPHI: /(?:patient|phi|medical|health)/i.test(content),
24
+ });
25
+ }
26
+ // Storage assets
27
+ if (/(?:s3|azure\.storage|gcs)\./i.test(line)) {
28
+ assets.push({
29
+ type: 'storage',
30
+ name: extractAssetName(line, 'storage'),
31
+ file,
32
+ line: i + 1,
33
+ processesPHI: /(?:patient|phi|medical)/i.test(content),
34
+ });
35
+ }
36
+ // Third-party integrations
37
+ if (/(?:stripe|twilio|sendgrid|mailgun)\.(?:api|client)/i.test(line)) {
38
+ assets.push({
39
+ type: 'third-party',
40
+ name: extractAssetName(line, 'third-party'),
41
+ file,
42
+ line: i + 1,
43
+ processesPHI: /(?:patient|phi|medical)/i.test(content),
44
+ });
45
+ }
46
+ // API endpoints
47
+ if (/(?:axios|fetch|got|request)\./i.test(line)) {
48
+ assets.push({
49
+ type: 'api',
50
+ name: extractAssetName(line, 'api'),
51
+ file,
52
+ line: i + 1,
53
+ processesPHI: /(?:patient|phi|medical)/i.test(content),
54
+ });
55
+ }
56
+ }
57
+ return assets;
58
+ }
59
+ /**
60
+ * Map PHI data flow through system
61
+ */
62
+ async function mapPHIFlow(file, content, lines) {
63
+ const flows = [];
64
+ for (let i = 0; i < lines.length; i++) {
65
+ const line = lines[i];
66
+ // Input points
67
+ if (/(?:req\.body|req\.params|req\.query).*?(?:patient|phi|medical)/i.test(line)) {
68
+ flows.push({
69
+ stage: 'input',
70
+ file,
71
+ line: i + 1,
72
+ context: line.trim(),
73
+ });
74
+ }
75
+ // Processing
76
+ if (/(?:process|transform|validate).*?(?:patient|phi)/i.test(line)) {
77
+ flows.push({
78
+ stage: 'processing',
79
+ file,
80
+ line: i + 1,
81
+ context: line.trim(),
82
+ });
83
+ }
84
+ // Storage
85
+ if (/(?:save|insert|update|create).*?(?:patient|phi)/i.test(line)) {
86
+ flows.push({
87
+ stage: 'storage',
88
+ file,
89
+ line: i + 1,
90
+ context: line.trim(),
91
+ });
92
+ }
93
+ // Output
94
+ if (/(?:res\.(?:send|json)|return).*?(?:patient|phi)/i.test(line)) {
95
+ flows.push({
96
+ stage: 'output',
97
+ file,
98
+ line: i + 1,
99
+ context: line.trim(),
100
+ });
101
+ }
102
+ }
103
+ return flows;
104
+ }
105
+ /**
106
+ * Check for vulnerability scanning configuration (project-level check)
107
+ */
108
+ async function checkVulnerabilityScanning(projectRoot) {
109
+ const configFiles = [
110
+ '.github/dependabot.yml',
111
+ '.github/dependabot.yaml',
112
+ '.github/workflows/security.yml',
113
+ '.github/workflows/security.yaml',
114
+ '.snyk',
115
+ '.semgrep.yml',
116
+ '.semgrep.yaml',
117
+ 'snyk.json',
118
+ '.trivyignore',
119
+ 'trivy.yaml',
120
+ ];
121
+ for (const configFile of configFiles) {
122
+ try {
123
+ await fs.access(path.join(projectRoot, configFile));
124
+ return true;
125
+ }
126
+ catch {
127
+ // File doesn't exist
128
+ }
129
+ }
130
+ // Check all workflow files for security-related scanning
131
+ try {
132
+ const workflowDir = path.join(projectRoot, '.github', 'workflows');
133
+ const entries = await fs.readdir(workflowDir);
134
+ for (const entry of entries) {
135
+ if (/security|codeql|snyk|trivy|semgrep|dependabot|vulnerability|sast|dast/i.test(entry)) {
136
+ return true;
137
+ }
138
+ // Also check workflow content for scanning steps
139
+ try {
140
+ const content = await fs.readFile(path.join(workflowDir, entry), 'utf-8');
141
+ if (/(?:snyk|trivy|semgrep|codeql|npm audit|security.scan|vulnerability)/i.test(content)) {
142
+ return true;
143
+ }
144
+ }
145
+ catch {
146
+ // Skip unreadable files
147
+ }
148
+ }
149
+ }
150
+ catch {
151
+ // No .github/workflows directory
152
+ }
153
+ // Check package.json for security scripts
154
+ try {
155
+ const packageJson = await fs.readFile(path.join(projectRoot, 'package.json'), 'utf-8');
156
+ if (/(?:snyk|audit|security)/.test(packageJson)) {
157
+ return true;
158
+ }
159
+ }
160
+ catch {
161
+ // No package.json
162
+ }
163
+ return false;
164
+ }
165
+ /**
166
+ * Extract asset name from code line
167
+ */
168
+ function extractAssetName(line, type) {
169
+ // Try to extract connection string or identifier
170
+ const match = line.match(/['"`]([^'"`]+)['"`]/);
171
+ if (match)
172
+ return match[1];
173
+ // Fallback to generic name
174
+ return `${type}-${Math.random().toString(36).substring(7)}`;
175
+ }
176
+ /**
177
+ * Format asset inventory for report
178
+ */
179
+ function formatAssetInventory(assets) {
180
+ const byType = assets.reduce((acc, asset) => {
181
+ if (!acc[asset.type])
182
+ acc[asset.type] = [];
183
+ acc[asset.type].push(asset);
184
+ return acc;
185
+ }, {});
186
+ let report = '## ePHI Technology Asset Inventory\n\n';
187
+ for (const [type, items] of Object.entries(byType)) {
188
+ report += `### ${type.toUpperCase()}\n`;
189
+ for (const item of items) {
190
+ const phi = item.processesPHI ? '⚠️ Processes PHI' : '';
191
+ report += `- ${item.name} (${item.file}:${item.line}) ${phi}\n`;
192
+ }
193
+ report += '\n';
194
+ }
195
+ return report;
196
+ }
197
+ /**
198
+ * Format PHI flow map for report
199
+ */
200
+ function formatPHIFlowMap(flows) {
201
+ const byStage = flows.reduce((acc, flow) => {
202
+ if (!acc[flow.stage])
203
+ acc[flow.stage] = [];
204
+ acc[flow.stage].push(flow);
205
+ return acc;
206
+ }, {});
207
+ let report = '## ePHI Data Flow Map\n\n';
208
+ const stages = ['input', 'processing', 'storage', 'output'];
209
+ for (const stage of stages) {
210
+ const items = byStage[stage] || [];
211
+ if (items.length === 0)
212
+ continue;
213
+ report += `### ${stage.toUpperCase()} (${items.length} points)\n`;
214
+ for (const item of items.slice(0, 5)) {
215
+ // Limit to 5 per stage
216
+ report += `- ${item.file}:${item.line} - ${item.context.substring(0, 60)}...\n`;
217
+ }
218
+ if (items.length > 5) {
219
+ report += `- ... and ${items.length - 5} more\n`;
220
+ }
221
+ report += '\n';
222
+ }
223
+ return report;
224
+ }
225
+ export const hipaa2026Scanner = {
226
+ name: 'HIPAA 2026 Security Rule Scanner',
227
+ category: 'access-control',
228
+ async scan(files, options) {
229
+ const findings = [];
230
+ const assetInventory = [];
231
+ const phiFlowMap = [];
232
+ // Filter to code files only
233
+ const codeFiles = files.filter((f) => /\.(js|ts|jsx|tsx|py|java|go|rb|php|cs)$/i.test(f));
234
+ for (const file of codeFiles) {
235
+ try {
236
+ const content = await fs.readFile(file, 'utf-8');
237
+ const lines = content.split('\n');
238
+ // Scan each HIPAA 2026 pattern
239
+ for (const pattern of ALL_HIPAA_2026_PATTERNS) {
240
+ // Special handling for asset inventory
241
+ if (pattern.id === 'HIPAA-ASSET-001') {
242
+ const assets = await generateAssetInventory(file, content, lines);
243
+ assetInventory.push(...assets);
244
+ continue;
245
+ }
246
+ // Special handling for PHI flow mapping
247
+ if (pattern.id === 'HIPAA-FLOW-001') {
248
+ const flows = await mapPHIFlow(file, content, lines);
249
+ phiFlowMap.push(...flows);
250
+ continue;
251
+ }
252
+ // Skip project-level checks in per-file loop (handled after)
253
+ if (pattern.id === 'HIPAA-PENTEST-001') {
254
+ continue;
255
+ }
256
+ // Standard pattern matching
257
+ for (let i = 0; i < lines.length; i++) {
258
+ const line = lines[i];
259
+ const lineNumber = i + 1;
260
+ // Check if line matches violation pattern
261
+ const matched = pattern.patterns.some((p) => p.test(line));
262
+ if (!matched)
263
+ continue;
264
+ // Check if negative patterns indicate compliance
265
+ const isCompliant = pattern.negativePatterns?.some((p) => {
266
+ // Check current line and next 3 lines for compliance indicators
267
+ const context = lines.slice(i, i + 4).join('\n');
268
+ return p.test(context);
269
+ }) || false;
270
+ if (isCompliant)
271
+ continue;
272
+ // Create finding
273
+ findings.push({
274
+ id: pattern.id,
275
+ category: pattern.category,
276
+ severity: pattern.severity,
277
+ title: pattern.name,
278
+ description: `${pattern.description}\n\nCode: ${line.trim()}`,
279
+ file: file,
280
+ line: lineNumber,
281
+ recommendation: pattern.autoFix ||
282
+ `Address ${pattern.name} per ${pattern.hipaaReference}`,
283
+ hipaaReference: pattern.hipaaReference,
284
+ confidence: pattern.confidence,
285
+ });
286
+ }
287
+ }
288
+ }
289
+ catch (error) {
290
+ // Skip files that can't be read
291
+ }
292
+ }
293
+ // Project-level check: vulnerability scanning (once, not per-file)
294
+ const pentestPattern = ALL_HIPAA_2026_PATTERNS.find(p => p.id === 'HIPAA-PENTEST-001');
295
+ if (pentestPattern) {
296
+ const hasVulnScanning = await checkVulnerabilityScanning(options.path);
297
+ if (!hasVulnScanning) {
298
+ findings.push({
299
+ id: pentestPattern.id,
300
+ category: pentestPattern.category,
301
+ severity: pentestPattern.severity,
302
+ title: pentestPattern.name,
303
+ description: pentestPattern.description,
304
+ file: 'project-level',
305
+ line: 1,
306
+ recommendation: pentestPattern.autoFix || '',
307
+ hipaaReference: pentestPattern.hipaaReference,
308
+ confidence: pentestPattern.confidence,
309
+ });
310
+ }
311
+ }
312
+ // Generate asset inventory finding
313
+ if (assetInventory.length > 0) {
314
+ findings.push({
315
+ id: 'HIPAA-ASSET-001',
316
+ category: 'data-retention',
317
+ severity: 'high',
318
+ title: 'ePHI Technology Asset Inventory Generated',
319
+ description: `Found ${assetInventory.length} assets processing ePHI`,
320
+ file: 'ASSET-INVENTORY',
321
+ line: 1,
322
+ recommendation: formatAssetInventory(assetInventory),
323
+ hipaaReference: '45 CFR §164.308(a)(1)(ii)(A) - Risk Analysis (Required)',
324
+ confidence: 'high',
325
+ });
326
+ }
327
+ // Generate PHI flow map finding
328
+ if (phiFlowMap.length > 0) {
329
+ findings.push({
330
+ id: 'HIPAA-FLOW-001',
331
+ category: 'data-retention',
332
+ severity: 'high',
333
+ title: 'ePHI Flow Map Generated',
334
+ description: `Identified ${phiFlowMap.length} PHI data flow points`,
335
+ file: 'PHI-FLOW-MAP',
336
+ line: 1,
337
+ recommendation: formatPHIFlowMap(phiFlowMap),
338
+ hipaaReference: '45 CFR §164.308(a)(1)(ii)(A) - Risk Analysis (Required)',
339
+ confidence: 'high',
340
+ });
341
+ }
342
+ return findings;
343
+ },
344
+ };
345
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/hipaa2026/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for HIPAA 2026 Security Rule Scanner
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/scanners/hipaa2026/index.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}