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.
- package/README.md +251 -615
- package/dist/cli.js +542 -0
- package/dist/cli.js.map +1 -1
- package/dist/marketplace/index.d.ts +8 -0
- package/dist/marketplace/index.d.ts.map +1 -0
- package/dist/marketplace/index.js +7 -0
- package/dist/marketplace/index.js.map +1 -0
- package/dist/marketplace/installer.d.ts +62 -0
- package/dist/marketplace/installer.d.ts.map +1 -0
- package/dist/marketplace/installer.js +254 -0
- package/dist/marketplace/installer.js.map +1 -0
- package/dist/marketplace/registry.d.ts +52 -0
- package/dist/marketplace/registry.d.ts.map +1 -0
- package/dist/marketplace/registry.js +759 -0
- package/dist/marketplace/registry.js.map +1 -0
- package/dist/marketplace/types.d.ts +123 -0
- package/dist/marketplace/types.d.ts.map +1 -0
- package/dist/marketplace/types.js +6 -0
- package/dist/marketplace/types.js.map +1 -0
- package/dist/reporters/audit-report.d.ts.map +1 -1
- package/dist/reporters/audit-report.js +180 -0
- package/dist/reporters/audit-report.js.map +1 -1
- package/dist/reporters/index.d.ts.map +1 -1
- package/dist/reporters/index.js +2612 -5
- package/dist/reporters/index.js.map +1 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +15 -1
- package/dist/scan.js.map +1 -1
- package/dist/scanners/api-security/index.d.ts +7 -0
- package/dist/scanners/api-security/index.d.ts.map +1 -0
- package/dist/scanners/api-security/index.js +139 -0
- package/dist/scanners/api-security/index.js.map +1 -0
- package/dist/scanners/api-security/index.test.d.ts +5 -0
- package/dist/scanners/api-security/index.test.d.ts.map +1 -0
- package/dist/scanners/api-security/index.test.js +360 -0
- package/dist/scanners/api-security/index.test.js.map +1 -0
- package/dist/scanners/api-security/patterns.d.ts +32 -0
- package/dist/scanners/api-security/patterns.d.ts.map +1 -0
- package/dist/scanners/api-security/patterns.js +159 -0
- package/dist/scanners/api-security/patterns.js.map +1 -0
- package/dist/scanners/authentication/index.d.ts +7 -0
- package/dist/scanners/authentication/index.d.ts.map +1 -0
- package/dist/scanners/authentication/index.js +107 -0
- package/dist/scanners/authentication/index.js.map +1 -0
- package/dist/scanners/authentication/index.test.d.ts +5 -0
- package/dist/scanners/authentication/index.test.d.ts.map +1 -0
- package/dist/scanners/authentication/index.test.js +379 -0
- package/dist/scanners/authentication/index.test.js.map +1 -0
- package/dist/scanners/authentication/patterns.d.ts +32 -0
- package/dist/scanners/authentication/patterns.d.ts.map +1 -0
- package/dist/scanners/authentication/patterns.js +133 -0
- package/dist/scanners/authentication/patterns.js.map +1 -0
- package/dist/scanners/configuration/index.d.ts +8 -0
- package/dist/scanners/configuration/index.d.ts.map +1 -0
- package/dist/scanners/configuration/index.js +87 -0
- package/dist/scanners/configuration/index.js.map +1 -0
- package/dist/scanners/configuration/index.test.d.ts +5 -0
- package/dist/scanners/configuration/index.test.d.ts.map +1 -0
- package/dist/scanners/configuration/index.test.js +344 -0
- package/dist/scanners/configuration/index.test.js.map +1 -0
- package/dist/scanners/configuration/patterns.d.ts +32 -0
- package/dist/scanners/configuration/patterns.d.ts.map +1 -0
- package/dist/scanners/configuration/patterns.js +146 -0
- package/dist/scanners/configuration/patterns.js.map +1 -0
- package/dist/scanners/credentials/index.d.ts +7 -0
- package/dist/scanners/credentials/index.d.ts.map +1 -0
- package/dist/scanners/credentials/index.js +129 -0
- package/dist/scanners/credentials/index.js.map +1 -0
- package/dist/scanners/credentials/index.test.d.ts +5 -0
- package/dist/scanners/credentials/index.test.d.ts.map +1 -0
- package/dist/scanners/credentials/index.test.js +395 -0
- package/dist/scanners/credentials/index.test.js.map +1 -0
- package/dist/scanners/credentials/patterns.d.ts +32 -0
- package/dist/scanners/credentials/patterns.d.ts.map +1 -0
- package/dist/scanners/credentials/patterns.js +140 -0
- package/dist/scanners/credentials/patterns.js.map +1 -0
- package/dist/scanners/errors/index.d.ts +8 -0
- package/dist/scanners/errors/index.d.ts.map +1 -0
- package/dist/scanners/errors/index.js +78 -0
- package/dist/scanners/errors/index.js.map +1 -0
- package/dist/scanners/errors/index.test.d.ts +5 -0
- package/dist/scanners/errors/index.test.d.ts.map +1 -0
- package/dist/scanners/errors/index.test.js +330 -0
- package/dist/scanners/errors/index.test.js.map +1 -0
- package/dist/scanners/errors/patterns.d.ts +27 -0
- package/dist/scanners/errors/patterns.d.ts.map +1 -0
- package/dist/scanners/errors/patterns.js +97 -0
- package/dist/scanners/errors/patterns.js.map +1 -0
- package/dist/scanners/hipaa2026/index.d.ts +8 -0
- package/dist/scanners/hipaa2026/index.d.ts.map +1 -0
- package/dist/scanners/hipaa2026/index.js +345 -0
- package/dist/scanners/hipaa2026/index.js.map +1 -0
- package/dist/scanners/hipaa2026/index.test.d.ts +5 -0
- package/dist/scanners/hipaa2026/index.test.d.ts.map +1 -0
- package/dist/scanners/hipaa2026/index.test.js +332 -0
- package/dist/scanners/hipaa2026/index.test.js.map +1 -0
- package/dist/scanners/hipaa2026/patterns.d.ts +57 -0
- package/dist/scanners/hipaa2026/patterns.d.ts.map +1 -0
- package/dist/scanners/hipaa2026/patterns.js +268 -0
- package/dist/scanners/hipaa2026/patterns.js.map +1 -0
- package/dist/scanners/operational/index.d.ts +7 -0
- package/dist/scanners/operational/index.d.ts.map +1 -0
- package/dist/scanners/operational/index.js +171 -0
- package/dist/scanners/operational/index.js.map +1 -0
- package/dist/scanners/operational/index.test.d.ts +5 -0
- package/dist/scanners/operational/index.test.d.ts.map +1 -0
- package/dist/scanners/operational/index.test.js +406 -0
- package/dist/scanners/operational/index.test.js.map +1 -0
- package/dist/scanners/operational/patterns.d.ts +33 -0
- package/dist/scanners/operational/patterns.d.ts.map +1 -0
- package/dist/scanners/operational/patterns.js +151 -0
- package/dist/scanners/operational/patterns.js.map +1 -0
- package/dist/scanners/rbac/index.d.ts +7 -0
- package/dist/scanners/rbac/index.d.ts.map +1 -0
- package/dist/scanners/rbac/index.js +145 -0
- package/dist/scanners/rbac/index.js.map +1 -0
- package/dist/scanners/rbac/index.test.d.ts +5 -0
- package/dist/scanners/rbac/index.test.d.ts.map +1 -0
- package/dist/scanners/rbac/index.test.js +422 -0
- package/dist/scanners/rbac/index.test.js.map +1 -0
- package/dist/scanners/rbac/patterns.d.ts +32 -0
- package/dist/scanners/rbac/patterns.d.ts.map +1 -0
- package/dist/scanners/rbac/patterns.js +124 -0
- package/dist/scanners/rbac/patterns.js.map +1 -0
- package/dist/scanners/revocation/index.d.ts +8 -0
- package/dist/scanners/revocation/index.d.ts.map +1 -0
- package/dist/scanners/revocation/index.js +83 -0
- package/dist/scanners/revocation/index.js.map +1 -0
- package/dist/scanners/revocation/index.test.d.ts +5 -0
- package/dist/scanners/revocation/index.test.d.ts.map +1 -0
- package/dist/scanners/revocation/index.test.js +332 -0
- package/dist/scanners/revocation/index.test.js.map +1 -0
- package/dist/scanners/revocation/patterns.d.ts +27 -0
- package/dist/scanners/revocation/patterns.d.ts.map +1 -0
- package/dist/scanners/revocation/patterns.js +109 -0
- package/dist/scanners/revocation/patterns.js.map +1 -0
- package/dist/scanners/sanitization/index.d.ts +8 -0
- package/dist/scanners/sanitization/index.d.ts.map +1 -0
- package/dist/scanners/sanitization/index.js +98 -0
- package/dist/scanners/sanitization/index.js.map +1 -0
- package/dist/scanners/sanitization/index.test.d.ts +5 -0
- package/dist/scanners/sanitization/index.test.d.ts.map +1 -0
- package/dist/scanners/sanitization/index.test.js +370 -0
- package/dist/scanners/sanitization/index.test.js.map +1 -0
- package/dist/scanners/sanitization/patterns.d.ts +27 -0
- package/dist/scanners/sanitization/patterns.d.ts.map +1 -0
- package/dist/scanners/sanitization/patterns.js +117 -0
- package/dist/scanners/sanitization/patterns.js.map +1 -0
- package/dist/training/certificate.d.ts +26 -0
- package/dist/training/certificate.d.ts.map +1 -0
- package/dist/training/certificate.js +92 -0
- package/dist/training/certificate.js.map +1 -0
- package/dist/training/index.d.ts +3 -0
- package/dist/training/index.d.ts.map +1 -0
- package/dist/training/index.js +243 -0
- package/dist/training/index.js.map +1 -0
- package/dist/training/modules.d.ts +13 -0
- package/dist/training/modules.d.ts.map +1 -0
- package/dist/training/modules.js +608 -0
- package/dist/training/modules.js.map +1 -0
- package/dist/training/questions.d.ts +9 -0
- package/dist/training/questions.d.ts.map +1 -0
- package/dist/training/questions.js +505 -0
- package/dist/training/questions.js.map +1 -0
- package/dist/types.d.ts +45 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/npm-audit.d.ts +6 -0
- package/dist/utils/npm-audit.d.ts.map +1 -0
- package/dist/utils/npm-audit.js +95 -0
- package/dist/utils/npm-audit.js.map +1 -0
- package/dist/utils/scan-history.d.ts +59 -0
- package/dist/utils/scan-history.d.ts.map +1 -0
- package/dist/utils/scan-history.js +170 -0
- package/dist/utils/scan-history.js.map +1 -0
- package/package.json +4 -1
- package/templates/baa-verification-letter.md +105 -0
- package/templates/irp.md +545 -0
- package/templates/notice-of-privacy-practices.md +491 -0
- package/templates/physical-safeguards-checklist.md +247 -0
- package/templates/security-officer-designation.md +237 -0
|
@@ -0,0 +1,759 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marketplace Registry Client
|
|
3
|
+
* Connects to vlayer community rules registry
|
|
4
|
+
*/
|
|
5
|
+
// Registry endpoints (future: api.vlayer.app/registry)
|
|
6
|
+
const REGISTRY_BASE_URL = process.env.VLAYER_REGISTRY_URL ||
|
|
7
|
+
'https://raw.githubusercontent.com/vlayer-registry/rules/main';
|
|
8
|
+
const BUILTIN_RULES_URL = `${REGISTRY_BASE_URL}/registry.json`;
|
|
9
|
+
const PACKAGES_URL = `${REGISTRY_BASE_URL}/packages.json`;
|
|
10
|
+
export class MarketplaceRegistry {
|
|
11
|
+
cache = new Map();
|
|
12
|
+
cacheExpiry = new Map();
|
|
13
|
+
CACHE_TTL = 3600000; // 1 hour
|
|
14
|
+
/**
|
|
15
|
+
* Search rules in the marketplace
|
|
16
|
+
*/
|
|
17
|
+
async search(query, filters, page = 1, pageSize = 20) {
|
|
18
|
+
const rules = await this.getAllRules();
|
|
19
|
+
let filtered = rules.filter((rule) => {
|
|
20
|
+
// Text search
|
|
21
|
+
const matchesQuery = !query ||
|
|
22
|
+
rule.name.toLowerCase().includes(query.toLowerCase()) ||
|
|
23
|
+
rule.description.toLowerCase().includes(query.toLowerCase()) ||
|
|
24
|
+
rule.tags.some((tag) => tag.toLowerCase().includes(query.toLowerCase()));
|
|
25
|
+
if (!matchesQuery)
|
|
26
|
+
return false;
|
|
27
|
+
// Apply filters
|
|
28
|
+
if (filters?.framework && rule.framework !== filters.framework)
|
|
29
|
+
return false;
|
|
30
|
+
if (filters?.jurisdiction && rule.jurisdiction !== filters.jurisdiction)
|
|
31
|
+
return false;
|
|
32
|
+
if (filters?.payer && rule.payer !== filters.payer)
|
|
33
|
+
return false;
|
|
34
|
+
if (filters?.techStack &&
|
|
35
|
+
(!rule.techStack || !rule.techStack.includes(filters.techStack)))
|
|
36
|
+
return false;
|
|
37
|
+
if (filters?.verified !== undefined && rule.verified !== filters.verified)
|
|
38
|
+
return false;
|
|
39
|
+
if (filters?.minRating && rule.rating < filters.minRating)
|
|
40
|
+
return false;
|
|
41
|
+
if (filters?.tags &&
|
|
42
|
+
!filters.tags.every((tag) => rule.tags.includes(tag)))
|
|
43
|
+
return false;
|
|
44
|
+
return true;
|
|
45
|
+
});
|
|
46
|
+
// Sort by relevance (downloads + rating)
|
|
47
|
+
filtered.sort((a, b) => {
|
|
48
|
+
const scoreA = a.downloads * 0.7 + a.rating * a.reviews * 0.3;
|
|
49
|
+
const scoreB = b.downloads * 0.7 + b.rating * b.reviews * 0.3;
|
|
50
|
+
return scoreB - scoreA;
|
|
51
|
+
});
|
|
52
|
+
// Pagination
|
|
53
|
+
const start = (page - 1) * pageSize;
|
|
54
|
+
const paginatedRules = filtered.slice(start, start + pageSize);
|
|
55
|
+
return {
|
|
56
|
+
rules: paginatedRules,
|
|
57
|
+
packages: [], // TODO: Add package search
|
|
58
|
+
total: filtered.length,
|
|
59
|
+
page,
|
|
60
|
+
pageSize,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get rule by ID
|
|
65
|
+
*/
|
|
66
|
+
async getRule(ruleId) {
|
|
67
|
+
const rules = await this.getAllRules();
|
|
68
|
+
return rules.find((r) => r.id === ruleId) || null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get package by ID
|
|
72
|
+
*/
|
|
73
|
+
async getPackage(packageId) {
|
|
74
|
+
const packages = await this.getAllPackages();
|
|
75
|
+
return packages.find((p) => p.id === packageId) || null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get marketplace metadata/stats
|
|
79
|
+
*/
|
|
80
|
+
async getMetadata() {
|
|
81
|
+
const cacheKey = 'metadata';
|
|
82
|
+
const cached = this.getFromCache(cacheKey);
|
|
83
|
+
if (cached)
|
|
84
|
+
return cached;
|
|
85
|
+
const rules = await this.getAllRules();
|
|
86
|
+
const packages = await this.getAllPackages();
|
|
87
|
+
// Calculate stats
|
|
88
|
+
const categories = {};
|
|
89
|
+
const frameworks = {};
|
|
90
|
+
for (const rule of rules) {
|
|
91
|
+
categories[rule.category] = (categories[rule.category] || 0) + 1;
|
|
92
|
+
frameworks[rule.framework] = (frameworks[rule.framework] || 0) + 1;
|
|
93
|
+
}
|
|
94
|
+
// Top contributors
|
|
95
|
+
const contributorMap = new Map();
|
|
96
|
+
for (const rule of rules) {
|
|
97
|
+
const name = rule.author.name;
|
|
98
|
+
const existing = contributorMap.get(name) || {
|
|
99
|
+
rulesPublished: 0,
|
|
100
|
+
downloads: 0,
|
|
101
|
+
};
|
|
102
|
+
existing.rulesPublished++;
|
|
103
|
+
existing.downloads += rule.downloads;
|
|
104
|
+
contributorMap.set(name, existing);
|
|
105
|
+
}
|
|
106
|
+
const topContributors = Array.from(contributorMap.entries())
|
|
107
|
+
.map(([name, stats]) => ({ name, ...stats }))
|
|
108
|
+
.sort((a, b) => b.downloads - a.downloads)
|
|
109
|
+
.slice(0, 10);
|
|
110
|
+
const metadata = {
|
|
111
|
+
totalRules: rules.length,
|
|
112
|
+
totalPackages: packages.length,
|
|
113
|
+
categories,
|
|
114
|
+
frameworks,
|
|
115
|
+
topContributors,
|
|
116
|
+
};
|
|
117
|
+
this.setCache(cacheKey, metadata);
|
|
118
|
+
return metadata;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get featured rules
|
|
122
|
+
*/
|
|
123
|
+
async getFeatured(limit = 10) {
|
|
124
|
+
const rules = await this.getAllRules();
|
|
125
|
+
// Featured = high rating + verified + recent
|
|
126
|
+
return rules
|
|
127
|
+
.filter((r) => r.verified && r.rating >= 4.0)
|
|
128
|
+
.sort((a, b) => {
|
|
129
|
+
const scoreA = new Date(a.updatedAt).getTime() + a.rating * 1000;
|
|
130
|
+
const scoreB = new Date(b.updatedAt).getTime() + b.rating * 1000;
|
|
131
|
+
return scoreB - scoreA;
|
|
132
|
+
})
|
|
133
|
+
.slice(0, limit);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get all rules from registry
|
|
137
|
+
*/
|
|
138
|
+
async getAllRules() {
|
|
139
|
+
const cacheKey = 'all-rules';
|
|
140
|
+
const cached = this.getFromCache(cacheKey);
|
|
141
|
+
if (cached)
|
|
142
|
+
return cached;
|
|
143
|
+
try {
|
|
144
|
+
// For now, return builtin example rules
|
|
145
|
+
// In production, fetch from BUILTIN_RULES_URL
|
|
146
|
+
const rules = this.getBuiltinRules();
|
|
147
|
+
this.setCache(cacheKey, rules);
|
|
148
|
+
return rules;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error('Failed to fetch rules from registry:', error);
|
|
152
|
+
return this.getBuiltinRules(); // Fallback to builtin
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get all packages from registry
|
|
157
|
+
*/
|
|
158
|
+
async getAllPackages() {
|
|
159
|
+
const cacheKey = 'all-packages';
|
|
160
|
+
const cached = this.getFromCache(cacheKey);
|
|
161
|
+
if (cached)
|
|
162
|
+
return cached;
|
|
163
|
+
try {
|
|
164
|
+
// For now, return builtin example packages
|
|
165
|
+
const packages = this.getBuiltinPackages();
|
|
166
|
+
this.setCache(cacheKey, packages);
|
|
167
|
+
return packages;
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
console.error('Failed to fetch packages from registry:', error);
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Cache helpers
|
|
176
|
+
*/
|
|
177
|
+
getFromCache(key) {
|
|
178
|
+
const expiry = this.cacheExpiry.get(key);
|
|
179
|
+
if (!expiry || Date.now() > expiry) {
|
|
180
|
+
this.cache.delete(key);
|
|
181
|
+
this.cacheExpiry.delete(key);
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
return this.cache.get(key);
|
|
185
|
+
}
|
|
186
|
+
setCache(key, value) {
|
|
187
|
+
this.cache.set(key, value);
|
|
188
|
+
this.cacheExpiry.set(key, Date.now() + this.CACHE_TTL);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Builtin example rules (will be moved to registry API)
|
|
192
|
+
*/
|
|
193
|
+
getBuiltinRules() {
|
|
194
|
+
return [
|
|
195
|
+
{
|
|
196
|
+
id: 'ca-cipa-minors-consent',
|
|
197
|
+
name: 'California CIPA - Minors Data Consent',
|
|
198
|
+
description: 'Ensures parental consent before collecting data from minors under 13 (California CIPA compliance)',
|
|
199
|
+
author: {
|
|
200
|
+
name: 'Healthcare Compliance Team',
|
|
201
|
+
organization: 'CA Department of Health',
|
|
202
|
+
verified: true,
|
|
203
|
+
},
|
|
204
|
+
version: '1.2.0',
|
|
205
|
+
framework: 'state-law',
|
|
206
|
+
jurisdiction: 'california',
|
|
207
|
+
tags: ['california', 'minors', 'consent', 'cipa'],
|
|
208
|
+
category: 'access-control',
|
|
209
|
+
severity: 'critical',
|
|
210
|
+
pattern: '(?:age|birthdate|dob).*?<\\s*13(?!.*?(?:consent|parental|guardian))',
|
|
211
|
+
recommendation: 'Implement parental consent flow for users under 13 before data collection',
|
|
212
|
+
references: [
|
|
213
|
+
'California CIPA §22575-22579',
|
|
214
|
+
'https://oag.ca.gov/privacy/ccpa',
|
|
215
|
+
],
|
|
216
|
+
downloads: 1234,
|
|
217
|
+
rating: 4.8,
|
|
218
|
+
reviews: 42,
|
|
219
|
+
verified: true,
|
|
220
|
+
createdAt: '2025-01-15T00:00:00Z',
|
|
221
|
+
updatedAt: '2026-01-20T00:00:00Z',
|
|
222
|
+
ruleDefinition: {
|
|
223
|
+
pattern: '(?:age|birthdate|dob).*?<\\s*13(?!.*?(?:consent|parental|guardian))',
|
|
224
|
+
flags: 'i',
|
|
225
|
+
contexts: ['code'],
|
|
226
|
+
},
|
|
227
|
+
examples: {
|
|
228
|
+
bad: [
|
|
229
|
+
'if (user.age < 13) { collectData(user); }',
|
|
230
|
+
'const isMinor = birthdate.getAge() < 13; saveToDatabase(userData);',
|
|
231
|
+
],
|
|
232
|
+
good: [
|
|
233
|
+
'if (user.age < 13 && !hasParentalConsent()) { return; }',
|
|
234
|
+
'if (isMinor && verifyGuardianConsent()) { collectData(user); }',
|
|
235
|
+
],
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
id: 'bcbs-prior-auth',
|
|
240
|
+
name: 'BCBS Prior Authorization Check',
|
|
241
|
+
description: 'Validates that prior authorization is obtained before high-cost procedures (BCBS requirement)',
|
|
242
|
+
author: {
|
|
243
|
+
name: 'John Smith',
|
|
244
|
+
organization: 'Blue Cross Blue Shield',
|
|
245
|
+
verified: true,
|
|
246
|
+
},
|
|
247
|
+
version: '2.0.1',
|
|
248
|
+
framework: 'payer-specific',
|
|
249
|
+
payer: 'bcbs',
|
|
250
|
+
tags: ['prior-auth', 'authorization', 'bcbs', 'procedures'],
|
|
251
|
+
category: 'access-control',
|
|
252
|
+
severity: 'high',
|
|
253
|
+
pattern: '(?:schedule|book).*?(?:surgery|mri|ct.scan)(?!.*?prior.?auth)',
|
|
254
|
+
recommendation: 'Add prior authorization check before scheduling high-cost procedures',
|
|
255
|
+
references: [
|
|
256
|
+
'BCBS Prior Authorization Guidelines',
|
|
257
|
+
'https://www.bcbs.com/prior-authorization',
|
|
258
|
+
],
|
|
259
|
+
downloads: 856,
|
|
260
|
+
rating: 4.5,
|
|
261
|
+
reviews: 28,
|
|
262
|
+
verified: true,
|
|
263
|
+
createdAt: '2025-11-10T00:00:00Z',
|
|
264
|
+
updatedAt: '2026-02-01T00:00:00Z',
|
|
265
|
+
ruleDefinition: {
|
|
266
|
+
pattern: '(?:schedule|book).*?(?:surgery|mri|ct.scan)(?!.*?prior.?auth)',
|
|
267
|
+
flags: 'i',
|
|
268
|
+
contexts: ['code'],
|
|
269
|
+
},
|
|
270
|
+
examples: {
|
|
271
|
+
bad: [
|
|
272
|
+
'scheduleSurgery(patient, "knee-replacement");',
|
|
273
|
+
'bookMRI(patient, appointmentDate);',
|
|
274
|
+
],
|
|
275
|
+
good: [
|
|
276
|
+
'if (hasPriorAuth(patient, "knee-replacement")) { scheduleSurgery(patient); }',
|
|
277
|
+
'await checkPriorAuthorization(); bookMRI(patient);',
|
|
278
|
+
],
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
id: 'fhir-r4-validation',
|
|
283
|
+
name: 'FHIR R4 Resource Validation',
|
|
284
|
+
description: 'Validates FHIR R4 resources have required fields before transmission',
|
|
285
|
+
author: {
|
|
286
|
+
name: 'HL7 Community',
|
|
287
|
+
organization: 'HL7 International',
|
|
288
|
+
verified: true,
|
|
289
|
+
},
|
|
290
|
+
version: '1.0.5',
|
|
291
|
+
framework: 'framework-specific',
|
|
292
|
+
techStack: ['fhir'],
|
|
293
|
+
tags: ['fhir', 'hl7', 'validation', 'interoperability'],
|
|
294
|
+
category: 'data-retention',
|
|
295
|
+
severity: 'medium',
|
|
296
|
+
pattern: 'new\\s+(?:Patient|Observation|Medication)(?!.*?\\.validate\\(\\))',
|
|
297
|
+
recommendation: 'Call .validate() on FHIR resources before sending to server',
|
|
298
|
+
references: [
|
|
299
|
+
'FHIR R4 Specification',
|
|
300
|
+
'https://www.hl7.org/fhir/validation.html',
|
|
301
|
+
],
|
|
302
|
+
downloads: 2341,
|
|
303
|
+
rating: 4.9,
|
|
304
|
+
reviews: 67,
|
|
305
|
+
verified: true,
|
|
306
|
+
createdAt: '2024-08-20T00:00:00Z',
|
|
307
|
+
updatedAt: '2025-12-15T00:00:00Z',
|
|
308
|
+
ruleDefinition: {
|
|
309
|
+
pattern: 'new\\s+(?:Patient|Observation|Medication)(?!.*?\\.validate\\(\\))',
|
|
310
|
+
contexts: ['code'],
|
|
311
|
+
},
|
|
312
|
+
examples: {
|
|
313
|
+
bad: [
|
|
314
|
+
'const patient = new Patient({ name: "John" }); api.send(patient);',
|
|
315
|
+
],
|
|
316
|
+
good: [
|
|
317
|
+
'const patient = new Patient({ name: "John" }); patient.validate(); api.send(patient);',
|
|
318
|
+
],
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
id: 'ny-encryption-mandate',
|
|
323
|
+
name: 'New York Encryption Mandate',
|
|
324
|
+
description: 'Ensures PHI is encrypted at rest per NY SHIELD Act requirements',
|
|
325
|
+
author: {
|
|
326
|
+
name: 'NY State Health Dept',
|
|
327
|
+
organization: 'New York Department of Health',
|
|
328
|
+
verified: true,
|
|
329
|
+
},
|
|
330
|
+
version: '1.1.0',
|
|
331
|
+
framework: 'state-law',
|
|
332
|
+
jurisdiction: 'new-york',
|
|
333
|
+
tags: ['encryption', 'new-york', 'shield-act', 'at-rest'],
|
|
334
|
+
category: 'encryption',
|
|
335
|
+
severity: 'critical',
|
|
336
|
+
pattern: '(?:fs\\.writeFile|writeFileSync).*?patient(?!.*?encrypt)',
|
|
337
|
+
recommendation: 'Encrypt PHI before writing to disk (AES-256 minimum per NY SHIELD Act)',
|
|
338
|
+
references: [
|
|
339
|
+
'NY SHIELD Act §899-aa',
|
|
340
|
+
'https://ag.ny.gov/shield-act',
|
|
341
|
+
],
|
|
342
|
+
downloads: 678,
|
|
343
|
+
rating: 4.7,
|
|
344
|
+
reviews: 19,
|
|
345
|
+
verified: true,
|
|
346
|
+
createdAt: '2025-03-01T00:00:00Z',
|
|
347
|
+
updatedAt: '2026-01-10T00:00:00Z',
|
|
348
|
+
ruleDefinition: {
|
|
349
|
+
pattern: '(?:fs\\.writeFile|writeFileSync).*?patient(?!.*?encrypt)',
|
|
350
|
+
flags: 'i',
|
|
351
|
+
contexts: ['code'],
|
|
352
|
+
},
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
id: 'medicare-audit-trail',
|
|
356
|
+
name: 'Medicare Audit Trail Requirement',
|
|
357
|
+
description: 'Ensures all Medicare claims modifications are logged per CMS requirements',
|
|
358
|
+
author: {
|
|
359
|
+
name: 'CMS Compliance',
|
|
360
|
+
organization: 'Centers for Medicare & Medicaid Services',
|
|
361
|
+
verified: true,
|
|
362
|
+
},
|
|
363
|
+
version: '1.3.2',
|
|
364
|
+
framework: 'payer-specific',
|
|
365
|
+
payer: 'medicare',
|
|
366
|
+
tags: ['medicare', 'cms', 'audit', 'claims'],
|
|
367
|
+
category: 'audit-logging',
|
|
368
|
+
severity: 'high',
|
|
369
|
+
pattern: '(?:UPDATE|DELETE).*?claims.*?WHERE.*?medicare(?!.*?(?:audit|log))',
|
|
370
|
+
recommendation: 'Add audit logging for all Medicare claims modifications',
|
|
371
|
+
references: [
|
|
372
|
+
'CMS Medicare Audit Requirements',
|
|
373
|
+
'https://www.cms.gov/regulations-and-guidance',
|
|
374
|
+
],
|
|
375
|
+
downloads: 1567,
|
|
376
|
+
rating: 4.6,
|
|
377
|
+
reviews: 53,
|
|
378
|
+
verified: true,
|
|
379
|
+
createdAt: '2024-06-15T00:00:00Z',
|
|
380
|
+
updatedAt: '2025-11-22T00:00:00Z',
|
|
381
|
+
ruleDefinition: {
|
|
382
|
+
pattern: '(?:UPDATE|DELETE).*?claims.*?WHERE.*?medicare(?!.*?(?:audit|log))',
|
|
383
|
+
flags: 'i',
|
|
384
|
+
contexts: ['code'],
|
|
385
|
+
},
|
|
386
|
+
},
|
|
387
|
+
// HIPAA 2026 Security Rule (all requirements now "required" instead of "addressable")
|
|
388
|
+
{
|
|
389
|
+
id: 'hipaa-mfa-001',
|
|
390
|
+
name: 'HIPAA 2026 - Multi-Factor Authentication Required',
|
|
391
|
+
description: 'Endpoints accessing PHI must enforce MFA per new HIPAA 2026 Security Rule',
|
|
392
|
+
author: {
|
|
393
|
+
name: 'HHS Office for Civil Rights',
|
|
394
|
+
organization: 'U.S. Department of Health & Human Services',
|
|
395
|
+
verified: true,
|
|
396
|
+
},
|
|
397
|
+
version: '1.0.0',
|
|
398
|
+
framework: 'hipaa',
|
|
399
|
+
tags: ['hipaa-2026', 'mfa', '2fa', 'authentication', 'access-control'],
|
|
400
|
+
category: 'access-control',
|
|
401
|
+
severity: 'critical',
|
|
402
|
+
pattern: '(?:login|authenticate|signin|auth).*?(?:patient|phi|medical|health)(?!.*?(?:mfa|multi.?factor|2fa|totp|authenticator))',
|
|
403
|
+
recommendation: 'Add MFA enforcement: requireMFA: true, verify TOTP/authenticator before granting access',
|
|
404
|
+
references: [
|
|
405
|
+
'45 CFR §164.312(a)(2)(i) - Access Control (Required)',
|
|
406
|
+
'https://www.hhs.gov/hipaa/for-professionals/security/index.html',
|
|
407
|
+
],
|
|
408
|
+
downloads: 0,
|
|
409
|
+
rating: 5.0,
|
|
410
|
+
reviews: 0,
|
|
411
|
+
verified: true,
|
|
412
|
+
createdAt: '2026-02-06T00:00:00Z',
|
|
413
|
+
updatedAt: '2026-02-06T00:00:00Z',
|
|
414
|
+
ruleDefinition: {
|
|
415
|
+
pattern: '(?:login|authenticate|signin|auth).*?(?:patient|phi|medical|health)(?!.*?(?:mfa|multi.?factor|2fa|totp|authenticator))',
|
|
416
|
+
flags: 'i',
|
|
417
|
+
contexts: ['code'],
|
|
418
|
+
},
|
|
419
|
+
examples: {
|
|
420
|
+
bad: [
|
|
421
|
+
'app.post("/login", async (req) => { const user = await User.findByCredentials(req.body); if (user.role === "doctor") accessPatientRecords(); });',
|
|
422
|
+
],
|
|
423
|
+
good: [
|
|
424
|
+
'app.post("/login", async (req) => { const user = await User.findByCredentials(req.body); if (!user.mfaVerified) return res.status(401); accessPatientRecords(); });',
|
|
425
|
+
],
|
|
426
|
+
},
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
id: 'hipaa-enc-rest-001',
|
|
430
|
+
name: 'HIPAA 2026 - Encryption at Rest Required',
|
|
431
|
+
description: 'All ePHI must be encrypted at rest using AES-256 or stronger per HIPAA 2026',
|
|
432
|
+
author: {
|
|
433
|
+
name: 'HHS Office for Civil Rights',
|
|
434
|
+
organization: 'U.S. Department of Health & Human Services',
|
|
435
|
+
verified: true,
|
|
436
|
+
},
|
|
437
|
+
version: '1.0.0',
|
|
438
|
+
framework: 'hipaa',
|
|
439
|
+
tags: ['hipaa-2026', 'encryption', 'at-rest', 'aes-256', 'security'],
|
|
440
|
+
category: 'encryption',
|
|
441
|
+
severity: 'critical',
|
|
442
|
+
pattern: '(?:mongoose|sequelize|typeorm|prisma)\\.(?:connect|createConnection).*?(?!.*?(?:encrypt|ssl|tls))',
|
|
443
|
+
recommendation: 'Enable encryption at rest: Set encrypt: true in DB config, use crypto.cipher for file storage',
|
|
444
|
+
references: [
|
|
445
|
+
'45 CFR §164.312(a)(2)(iv) - Encryption (Required)',
|
|
446
|
+
'https://www.hhs.gov/hipaa/for-professionals/security/index.html',
|
|
447
|
+
],
|
|
448
|
+
downloads: 0,
|
|
449
|
+
rating: 5.0,
|
|
450
|
+
reviews: 0,
|
|
451
|
+
verified: true,
|
|
452
|
+
createdAt: '2026-02-06T00:00:00Z',
|
|
453
|
+
updatedAt: '2026-02-06T00:00:00Z',
|
|
454
|
+
ruleDefinition: {
|
|
455
|
+
pattern: '(?:mongoose|sequelize|typeorm|prisma)\\.(?:connect|createConnection).*?(?!.*?(?:encrypt|ssl|tls))',
|
|
456
|
+
flags: 'i',
|
|
457
|
+
contexts: ['code'],
|
|
458
|
+
},
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
id: 'hipaa-session-001',
|
|
462
|
+
name: 'HIPAA 2026 - Session Timeout Required',
|
|
463
|
+
description: 'PHI access sessions must auto-expire within 15 minutes of inactivity',
|
|
464
|
+
author: {
|
|
465
|
+
name: 'HHS Office for Civil Rights',
|
|
466
|
+
organization: 'U.S. Department of Health & Human Services',
|
|
467
|
+
verified: true,
|
|
468
|
+
},
|
|
469
|
+
version: '1.0.0',
|
|
470
|
+
framework: 'hipaa',
|
|
471
|
+
tags: ['hipaa-2026', 'session', 'timeout', 'inactivity', 'security'],
|
|
472
|
+
category: 'access-control',
|
|
473
|
+
severity: 'high',
|
|
474
|
+
pattern: '(?:express-session|session)\\.(?:configure|use)(?!.*?(?:maxAge|expires|timeout))',
|
|
475
|
+
recommendation: 'Set session timeout: maxAge: 900000 (15 min), implement idle timeout detector',
|
|
476
|
+
references: [
|
|
477
|
+
'45 CFR §164.312(a)(2)(iii) - Session Control (Required)',
|
|
478
|
+
'https://www.hhs.gov/hipaa/for-professionals/security/index.html',
|
|
479
|
+
],
|
|
480
|
+
downloads: 0,
|
|
481
|
+
rating: 5.0,
|
|
482
|
+
reviews: 0,
|
|
483
|
+
verified: true,
|
|
484
|
+
createdAt: '2026-02-06T00:00:00Z',
|
|
485
|
+
updatedAt: '2026-02-06T00:00:00Z',
|
|
486
|
+
ruleDefinition: {
|
|
487
|
+
pattern: '(?:express-session|session)\\.(?:configure|use)(?!.*?(?:maxAge|expires|timeout))',
|
|
488
|
+
flags: 'i',
|
|
489
|
+
contexts: ['code'],
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
{
|
|
493
|
+
id: 'hipaa-revoke-001',
|
|
494
|
+
name: 'HIPAA 2026 - Immediate Access Revocation Required',
|
|
495
|
+
description: 'User deactivation must immediately invalidate all sessions and tokens',
|
|
496
|
+
author: {
|
|
497
|
+
name: 'HHS Office for Civil Rights',
|
|
498
|
+
organization: 'U.S. Department of Health & Human Services',
|
|
499
|
+
verified: true,
|
|
500
|
+
},
|
|
501
|
+
version: '1.0.0',
|
|
502
|
+
framework: 'hipaa',
|
|
503
|
+
tags: ['hipaa-2026', 'revocation', 'termination', 'access', 'security'],
|
|
504
|
+
category: 'access-control',
|
|
505
|
+
severity: 'critical',
|
|
506
|
+
pattern: '(?:deactivate|disable|remove)User(?!.*?(?:revoke|invalidate|blacklist).*?(?:token|session))',
|
|
507
|
+
recommendation: 'Add token revocation: Call revokeAllTokens() and invalidateAllSessions() on user deactivation',
|
|
508
|
+
references: [
|
|
509
|
+
'45 CFR §164.308(a)(3)(ii)(C) - Termination Procedures (Required)',
|
|
510
|
+
'https://www.hhs.gov/hipaa/for-professionals/security/index.html',
|
|
511
|
+
],
|
|
512
|
+
downloads: 0,
|
|
513
|
+
rating: 5.0,
|
|
514
|
+
reviews: 0,
|
|
515
|
+
verified: true,
|
|
516
|
+
createdAt: '2026-02-06T00:00:00Z',
|
|
517
|
+
updatedAt: '2026-02-06T00:00:00Z',
|
|
518
|
+
ruleDefinition: {
|
|
519
|
+
pattern: '(?:deactivate|disable|remove)User(?!.*?(?:revoke|invalidate|blacklist).*?(?:token|session))',
|
|
520
|
+
flags: 'i',
|
|
521
|
+
contexts: ['code'],
|
|
522
|
+
},
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
id: 'hipaa-breach-001',
|
|
526
|
+
name: 'HIPAA 2026 - Breach Notification Required',
|
|
527
|
+
description: 'Must have automated breach detection and notification within 24 hours',
|
|
528
|
+
author: {
|
|
529
|
+
name: 'HHS Office for Civil Rights',
|
|
530
|
+
organization: 'U.S. Department of Health & Human Services',
|
|
531
|
+
verified: true,
|
|
532
|
+
},
|
|
533
|
+
version: '1.0.0',
|
|
534
|
+
framework: 'hipaa',
|
|
535
|
+
tags: ['hipaa-2026', 'breach', 'notification', 'incident', 'security'],
|
|
536
|
+
category: 'audit-logging',
|
|
537
|
+
severity: 'critical',
|
|
538
|
+
pattern: 'catch\\s*\\(.*?error.*?\\).*?(?:security|unauthorized|breach)(?!.*?(?:notifyBreach|incidentResponse|alertSecurity))',
|
|
539
|
+
recommendation: 'Implement breach notification: Create incident response handler, set up 24h alert system',
|
|
540
|
+
references: [
|
|
541
|
+
'45 CFR §164.308(a)(6)(ii) - Security Incident Procedures (Required)',
|
|
542
|
+
'https://www.hhs.gov/hipaa/for-professionals/security/index.html',
|
|
543
|
+
],
|
|
544
|
+
downloads: 0,
|
|
545
|
+
rating: 5.0,
|
|
546
|
+
reviews: 0,
|
|
547
|
+
verified: true,
|
|
548
|
+
createdAt: '2026-02-06T00:00:00Z',
|
|
549
|
+
updatedAt: '2026-02-06T00:00:00Z',
|
|
550
|
+
ruleDefinition: {
|
|
551
|
+
pattern: 'catch\\s*\\(.*?error.*?\\).*?(?:security|unauthorized|breach)(?!.*?(?:notifyBreach|incidentResponse|alertSecurity))',
|
|
552
|
+
flags: 'i',
|
|
553
|
+
contexts: ['code'],
|
|
554
|
+
},
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
id: 'hipaa-segment-001',
|
|
558
|
+
name: 'HIPAA 2026 - Network Segmentation Required',
|
|
559
|
+
description: 'PHI services must be network-segmented with restricted CORS and firewall rules',
|
|
560
|
+
author: {
|
|
561
|
+
name: 'HHS Office for Civil Rights',
|
|
562
|
+
organization: 'U.S. Department of Health & Human Services',
|
|
563
|
+
verified: true,
|
|
564
|
+
},
|
|
565
|
+
version: '1.0.0',
|
|
566
|
+
framework: 'hipaa',
|
|
567
|
+
tags: ['hipaa-2026', 'network', 'segmentation', 'cors', 'firewall'],
|
|
568
|
+
category: 'access-control',
|
|
569
|
+
severity: 'critical',
|
|
570
|
+
pattern: 'cors\\(\\{?\\s*origin:\\s*[\'"]?\\*[\'"]?.*?(?:patient|phi|medical)',
|
|
571
|
+
recommendation: 'Implement network segmentation: Use VPC/subnet isolation, restrict CORS to whitelisted origins',
|
|
572
|
+
references: [
|
|
573
|
+
'45 CFR §164.312(e)(1) - Transmission Security (Required)',
|
|
574
|
+
'https://www.hhs.gov/hipaa/for-professionals/security/index.html',
|
|
575
|
+
],
|
|
576
|
+
downloads: 0,
|
|
577
|
+
rating: 5.0,
|
|
578
|
+
reviews: 0,
|
|
579
|
+
verified: true,
|
|
580
|
+
createdAt: '2026-02-06T00:00:00Z',
|
|
581
|
+
updatedAt: '2026-02-06T00:00:00Z',
|
|
582
|
+
ruleDefinition: {
|
|
583
|
+
pattern: 'cors\\(\\{?\\s*origin:\\s*[\'"]?\\*[\'"]?.*?(?:patient|phi|medical)',
|
|
584
|
+
flags: 'i',
|
|
585
|
+
contexts: ['code'],
|
|
586
|
+
},
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
id: 'hipaa-asset-001',
|
|
590
|
+
name: 'HIPAA 2026 - Technology Asset Inventory',
|
|
591
|
+
description: 'Automatic inventory of all systems processing, storing, or transmitting ePHI',
|
|
592
|
+
author: {
|
|
593
|
+
name: 'HHS Office for Civil Rights',
|
|
594
|
+
organization: 'U.S. Department of Health & Human Services',
|
|
595
|
+
verified: true,
|
|
596
|
+
},
|
|
597
|
+
version: '1.0.0',
|
|
598
|
+
framework: 'hipaa',
|
|
599
|
+
tags: ['hipaa-2026', 'asset', 'inventory', 'risk-analysis', 'compliance'],
|
|
600
|
+
category: 'data-retention',
|
|
601
|
+
severity: 'high',
|
|
602
|
+
pattern: '(?:mongoose|sequelize|prisma|typeorm|knex)\\.(?:connect|model)',
|
|
603
|
+
recommendation: 'Asset inventory will be generated automatically in scan report',
|
|
604
|
+
references: [
|
|
605
|
+
'45 CFR §164.308(a)(1)(ii)(A) - Risk Analysis (Required)',
|
|
606
|
+
'https://www.hhs.gov/hipaa/for-professionals/security/index.html',
|
|
607
|
+
],
|
|
608
|
+
downloads: 0,
|
|
609
|
+
rating: 5.0,
|
|
610
|
+
reviews: 0,
|
|
611
|
+
verified: true,
|
|
612
|
+
createdAt: '2026-02-06T00:00:00Z',
|
|
613
|
+
updatedAt: '2026-02-06T00:00:00Z',
|
|
614
|
+
ruleDefinition: {
|
|
615
|
+
pattern: '(?:mongoose|sequelize|prisma|typeorm|knex)\\.(?:connect|model)',
|
|
616
|
+
flags: 'i',
|
|
617
|
+
contexts: ['code'],
|
|
618
|
+
},
|
|
619
|
+
},
|
|
620
|
+
{
|
|
621
|
+
id: 'hipaa-flow-001',
|
|
622
|
+
name: 'HIPAA 2026 - ePHI Flow Mapping',
|
|
623
|
+
description: 'Automatic mapping of PHI data flow through system (input → processing → storage → output)',
|
|
624
|
+
author: {
|
|
625
|
+
name: 'HHS Office for Civil Rights',
|
|
626
|
+
organization: 'U.S. Department of Health & Human Services',
|
|
627
|
+
verified: true,
|
|
628
|
+
},
|
|
629
|
+
version: '1.0.0',
|
|
630
|
+
framework: 'hipaa',
|
|
631
|
+
tags: ['hipaa-2026', 'data-flow', 'phi', 'mapping', 'risk-analysis'],
|
|
632
|
+
category: 'data-retention',
|
|
633
|
+
severity: 'high',
|
|
634
|
+
pattern: '(?:req\\.body|req\\.params|req\\.query).*?(?:patient|phi|medical)',
|
|
635
|
+
recommendation: 'PHI flow map will be generated automatically in scan report',
|
|
636
|
+
references: [
|
|
637
|
+
'45 CFR §164.308(a)(1)(ii)(A) - Risk Analysis (Required)',
|
|
638
|
+
'https://www.hhs.gov/hipaa/for-professionals/security/index.html',
|
|
639
|
+
],
|
|
640
|
+
downloads: 0,
|
|
641
|
+
rating: 5.0,
|
|
642
|
+
reviews: 0,
|
|
643
|
+
verified: true,
|
|
644
|
+
createdAt: '2026-02-06T00:00:00Z',
|
|
645
|
+
updatedAt: '2026-02-06T00:00:00Z',
|
|
646
|
+
ruleDefinition: {
|
|
647
|
+
pattern: '(?:req\\.body|req\\.params|req\\.query).*?(?:patient|phi|medical)',
|
|
648
|
+
flags: 'i',
|
|
649
|
+
contexts: ['code'],
|
|
650
|
+
},
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
id: 'hipaa-pentest-001',
|
|
654
|
+
name: 'HIPAA 2026 - Vulnerability Scanning Required',
|
|
655
|
+
description: 'Must have automated vulnerability scanning (Dependabot, Snyk, Trivy) in CI/CD',
|
|
656
|
+
author: {
|
|
657
|
+
name: 'HHS Office for Civil Rights',
|
|
658
|
+
organization: 'U.S. Department of Health & Human Services',
|
|
659
|
+
verified: true,
|
|
660
|
+
},
|
|
661
|
+
version: '1.0.0',
|
|
662
|
+
framework: 'hipaa',
|
|
663
|
+
tags: ['hipaa-2026', 'vulnerability', 'scanning', 'pentest', 'security'],
|
|
664
|
+
category: 'audit-logging',
|
|
665
|
+
severity: 'high',
|
|
666
|
+
pattern: 'package\\.json(?!.*?(?:snyk|audit|vulnerability))',
|
|
667
|
+
recommendation: 'Add vulnerability scanning: Enable Dependabot, add Snyk/Trivy to CI/CD pipeline',
|
|
668
|
+
references: [
|
|
669
|
+
'45 CFR §164.308(a)(8) - Evaluation (Required)',
|
|
670
|
+
'https://www.hhs.gov/hipaa/for-professionals/security/index.html',
|
|
671
|
+
],
|
|
672
|
+
downloads: 0,
|
|
673
|
+
rating: 5.0,
|
|
674
|
+
reviews: 0,
|
|
675
|
+
verified: true,
|
|
676
|
+
createdAt: '2026-02-06T00:00:00Z',
|
|
677
|
+
updatedAt: '2026-02-06T00:00:00Z',
|
|
678
|
+
ruleDefinition: {
|
|
679
|
+
pattern: 'package\\.json(?!.*?(?:snyk|audit|vulnerability))',
|
|
680
|
+
flags: 'i',
|
|
681
|
+
contexts: ['code'],
|
|
682
|
+
},
|
|
683
|
+
},
|
|
684
|
+
];
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Builtin example packages
|
|
688
|
+
*/
|
|
689
|
+
getBuiltinPackages() {
|
|
690
|
+
return [
|
|
691
|
+
{
|
|
692
|
+
id: 'california-compliance-pack',
|
|
693
|
+
name: 'California Healthcare Compliance Pack',
|
|
694
|
+
description: 'Complete set of California-specific healthcare compliance rules (CIPA, CMIA, CCPA)',
|
|
695
|
+
author: {
|
|
696
|
+
name: 'CA Health Dept',
|
|
697
|
+
organization: 'California Department of Public Health',
|
|
698
|
+
},
|
|
699
|
+
version: '2.1.0',
|
|
700
|
+
rules: ['ca-cipa-minors-consent', 'ca-cmia-disclosure', 'ca-ccpa-deletion'],
|
|
701
|
+
category: 'state-law',
|
|
702
|
+
downloads: 892,
|
|
703
|
+
verified: true,
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
id: 'bcbs-complete',
|
|
707
|
+
name: 'BCBS Complete Compliance',
|
|
708
|
+
description: 'All Blue Cross Blue Shield payer-specific requirements',
|
|
709
|
+
author: {
|
|
710
|
+
name: 'BCBS Network',
|
|
711
|
+
},
|
|
712
|
+
version: '1.5.0',
|
|
713
|
+
rules: ['bcbs-prior-auth', 'bcbs-network-verification', 'bcbs-timely-filing'],
|
|
714
|
+
category: 'payer-specific',
|
|
715
|
+
downloads: 456,
|
|
716
|
+
verified: true,
|
|
717
|
+
},
|
|
718
|
+
{
|
|
719
|
+
id: 'fhir-starter-pack',
|
|
720
|
+
name: 'FHIR Implementation Starter Pack',
|
|
721
|
+
description: 'Essential FHIR R4 validation and compliance rules',
|
|
722
|
+
author: {
|
|
723
|
+
name: 'HL7 Community',
|
|
724
|
+
organization: 'HL7 International',
|
|
725
|
+
},
|
|
726
|
+
version: '3.0.0',
|
|
727
|
+
rules: ['fhir-r4-validation', 'fhir-resource-references', 'fhir-security-labels'],
|
|
728
|
+
category: 'framework-specific',
|
|
729
|
+
downloads: 3421,
|
|
730
|
+
verified: true,
|
|
731
|
+
},
|
|
732
|
+
{
|
|
733
|
+
id: 'hipaa-2026-security-rule',
|
|
734
|
+
name: 'HIPAA 2026 Complete Security Rule Pack',
|
|
735
|
+
description: 'Complete set of HIPAA 2026 Security Rule requirements (15/15 technical safeguards now required)',
|
|
736
|
+
author: {
|
|
737
|
+
name: 'HHS Office for Civil Rights',
|
|
738
|
+
organization: 'U.S. Department of Health & Human Services',
|
|
739
|
+
},
|
|
740
|
+
version: '1.0.0',
|
|
741
|
+
rules: [
|
|
742
|
+
'hipaa-mfa-001',
|
|
743
|
+
'hipaa-enc-rest-001',
|
|
744
|
+
'hipaa-session-001',
|
|
745
|
+
'hipaa-revoke-001',
|
|
746
|
+
'hipaa-breach-001',
|
|
747
|
+
'hipaa-segment-001',
|
|
748
|
+
'hipaa-asset-001',
|
|
749
|
+
'hipaa-flow-001',
|
|
750
|
+
'hipaa-pentest-001',
|
|
751
|
+
],
|
|
752
|
+
category: 'hipaa',
|
|
753
|
+
downloads: 0,
|
|
754
|
+
verified: true,
|
|
755
|
+
},
|
|
756
|
+
];
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
//# sourceMappingURL=registry.js.map
|