@ansvar/eu-regulations-mcp 0.1.0 → 0.2.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/LICENSE +190 -21
- package/README.md +125 -26
- package/data/seed/aifmd.json +432 -0
- package/data/seed/applicability/ai-act.json +87 -0
- package/data/seed/applicability/aifmd.json +74 -0
- package/data/seed/applicability/cbam.json +74 -0
- package/data/seed/applicability/cer.json +74 -0
- package/data/seed/applicability/cra.json +77 -0
- package/data/seed/applicability/csddd.json +74 -0
- package/data/seed/applicability/csrd.json +74 -0
- package/data/seed/applicability/cyber_solidarity.json +74 -0
- package/data/seed/applicability/cybersecurity-act.json +69 -0
- package/data/seed/applicability/data-act.json +71 -0
- package/data/seed/applicability/dga.json +74 -0
- package/data/seed/applicability/dma.json +77 -0
- package/data/seed/applicability/dsa.json +71 -0
- package/data/seed/applicability/eecc.json +74 -0
- package/data/seed/applicability/ehds.json +74 -0
- package/data/seed/applicability/eidas2.json +86 -0
- package/data/seed/applicability/eprivacy.json +74 -0
- package/data/seed/applicability/eu_taxonomy.json +74 -0
- package/data/seed/applicability/eucc.json +74 -0
- package/data/seed/applicability/eudr.json +74 -0
- package/data/seed/applicability/gpsr.json +74 -0
- package/data/seed/applicability/ivdr.json +74 -0
- package/data/seed/applicability/led.json +74 -0
- package/data/seed/applicability/machinery.json +74 -0
- package/data/seed/applicability/mdr.json +74 -0
- package/data/seed/applicability/mica.json +74 -0
- package/data/seed/applicability/mifid2.json +74 -0
- package/data/seed/applicability/mifir.json +74 -0
- package/data/seed/applicability/pld.json +74 -0
- package/data/seed/applicability/psd2.json +74 -0
- package/data/seed/applicability/red.json +74 -0
- package/data/seed/applicability/sfdr.json +74 -0
- package/data/seed/applicability/un-r155.json +68 -0
- package/data/seed/applicability/un-r156.json +68 -0
- package/data/seed/cbam.json +397 -0
- package/data/seed/cer.json +233 -0
- package/data/seed/csddd.json +205 -0
- package/data/seed/csrd.json +50 -0
- package/data/seed/cyber_solidarity.json +252 -0
- package/data/seed/data-act.json +517 -0
- package/data/seed/dga.json +342 -0
- package/data/seed/dma.json +499 -0
- package/data/seed/dsa.json +686 -0
- package/data/seed/eecc.json +981 -0
- package/data/seed/ehds.json +638 -0
- package/data/seed/eidas2.json +590 -0
- package/data/seed/eprivacy.json +115 -0
- package/data/seed/eu_taxonomy.json +285 -0
- package/data/seed/eucc.json +386 -0
- package/data/seed/eudr.json +401 -0
- package/data/seed/gpsr.json +462 -0
- package/data/seed/ivdr.json +1036 -0
- package/data/seed/led.json +480 -0
- package/data/seed/machinery.json +513 -0
- package/data/seed/mappings/iso27001-ai-act.json +114 -0
- package/data/seed/mappings/iso27001-aifmd.json +50 -0
- package/data/seed/mappings/iso27001-cbam.json +26 -0
- package/data/seed/mappings/iso27001-cer.json +74 -0
- package/data/seed/mappings/iso27001-cra.json +130 -0
- package/data/seed/mappings/iso27001-csddd.json +50 -0
- package/data/seed/mappings/iso27001-csrd.json +26 -0
- package/data/seed/mappings/iso27001-cyber_solidarity.json +82 -0
- package/data/seed/mappings/iso27001-cybersecurity-act.json +90 -0
- package/data/seed/mappings/iso27001-data-act.json +66 -0
- package/data/seed/mappings/iso27001-dga.json +50 -0
- package/data/seed/mappings/iso27001-dma.json +50 -0
- package/data/seed/mappings/iso27001-dsa.json +58 -0
- package/data/seed/mappings/iso27001-eecc.json +74 -0
- package/data/seed/mappings/iso27001-ehds.json +90 -0
- package/data/seed/mappings/iso27001-eidas2.json +106 -0
- package/data/seed/mappings/iso27001-eprivacy.json +66 -0
- package/data/seed/mappings/iso27001-eu_taxonomy.json +34 -0
- package/data/seed/mappings/iso27001-eucc.json +66 -0
- package/data/seed/mappings/iso27001-eudr.json +34 -0
- package/data/seed/mappings/iso27001-gpsr.json +42 -0
- package/data/seed/mappings/iso27001-ivdr.json +66 -0
- package/data/seed/mappings/iso27001-led.json +74 -0
- package/data/seed/mappings/iso27001-machinery.json +50 -0
- package/data/seed/mappings/iso27001-mdr.json +82 -0
- package/data/seed/mappings/iso27001-mica.json +66 -0
- package/data/seed/mappings/iso27001-mifid2.json +66 -0
- package/data/seed/mappings/iso27001-mifir.json +42 -0
- package/data/seed/mappings/iso27001-pld.json +26 -0
- package/data/seed/mappings/iso27001-psd2.json +82 -0
- package/data/seed/mappings/iso27001-red.json +42 -0
- package/data/seed/mappings/iso27001-sfdr.json +50 -0
- package/data/seed/mappings/iso27001-un-r155.json +130 -0
- package/data/seed/mappings/iso27001-un-r156.json +106 -0
- package/data/seed/mappings/nist-csf-ai-act.json +138 -0
- package/data/seed/mappings/nist-csf-aifmd.json +58 -0
- package/data/seed/mappings/nist-csf-cbam.json +42 -0
- package/data/seed/mappings/nist-csf-cer.json +90 -0
- package/data/seed/mappings/nist-csf-cra.json +130 -0
- package/data/seed/mappings/nist-csf-csddd.json +50 -0
- package/data/seed/mappings/nist-csf-csrd.json +34 -0
- package/data/seed/mappings/nist-csf-cyber_solidarity.json +90 -0
- package/data/seed/mappings/nist-csf-cybersecurity-act.json +90 -0
- package/data/seed/mappings/nist-csf-data-act.json +50 -0
- package/data/seed/mappings/nist-csf-dga.json +58 -0
- package/data/seed/mappings/nist-csf-dma.json +42 -0
- package/data/seed/mappings/nist-csf-dora.json +210 -0
- package/data/seed/mappings/nist-csf-dsa.json +82 -0
- package/data/seed/mappings/nist-csf-eecc.json +90 -0
- package/data/seed/mappings/nist-csf-ehds.json +98 -0
- package/data/seed/mappings/nist-csf-eidas2.json +114 -0
- package/data/seed/mappings/nist-csf-eprivacy.json +58 -0
- package/data/seed/mappings/nist-csf-eu_taxonomy.json +34 -0
- package/data/seed/mappings/nist-csf-eucc.json +66 -0
- package/data/seed/mappings/nist-csf-eudr.json +58 -0
- package/data/seed/mappings/nist-csf-gdpr.json +178 -0
- package/data/seed/mappings/nist-csf-gpsr.json +58 -0
- package/data/seed/mappings/nist-csf-ivdr.json +66 -0
- package/data/seed/mappings/nist-csf-led.json +74 -0
- package/data/seed/mappings/nist-csf-machinery.json +58 -0
- package/data/seed/mappings/nist-csf-mdr.json +66 -0
- package/data/seed/mappings/nist-csf-mica.json +98 -0
- package/data/seed/mappings/nist-csf-mifid2.json +74 -0
- package/data/seed/mappings/nist-csf-mifir.json +50 -0
- package/data/seed/mappings/nist-csf-nis2.json +194 -0
- package/data/seed/mappings/nist-csf-pld.json +34 -0
- package/data/seed/mappings/nist-csf-psd2.json +98 -0
- package/data/seed/mappings/nist-csf-red.json +58 -0
- package/data/seed/mappings/nist-csf-sfdr.json +42 -0
- package/data/seed/mappings/nist-csf-un-r155.json +130 -0
- package/data/seed/mappings/nist-csf-un-r156.json +98 -0
- package/data/seed/mdr.json +1066 -0
- package/data/seed/mica.json +1003 -0
- package/data/seed/mifid2.json +906 -0
- package/data/seed/mifir.json +512 -0
- package/data/seed/pld.json +244 -0
- package/data/seed/psd2.json +827 -0
- package/data/seed/red.json +452 -0
- package/data/seed/sfdr.json +228 -0
- package/data/seed/un-r155.json +166 -0
- package/data/seed/un-r156.json +150 -0
- package/dist/http-server.d.ts +9 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +342 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/tools/map.d.ts +1 -1
- package/dist/tools/map.d.ts.map +1 -1
- package/dist/tools/map.js +3 -3
- package/dist/tools/map.js.map +1 -1
- package/package.json +6 -2
- package/scripts/build-db.ts +20 -8
- package/scripts/check-updates.ts +141 -39
- package/scripts/ingest-eurlex.ts +9 -1
- package/scripts/ingest-unece.ts +368 -0
- package/src/http-server.ts +380 -0
- package/src/index.ts +4 -4
- package/src/tools/map.ts +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -114,18 +114,18 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
114
114
|
},
|
|
115
115
|
{
|
|
116
116
|
name: 'map_controls',
|
|
117
|
-
description: 'Map
|
|
117
|
+
description: 'Map security framework controls to EU regulation requirements. Shows which articles satisfy specific security controls.',
|
|
118
118
|
inputSchema: {
|
|
119
119
|
type: 'object',
|
|
120
120
|
properties: {
|
|
121
121
|
framework: {
|
|
122
122
|
type: 'string',
|
|
123
|
-
enum: ['ISO27001'],
|
|
124
|
-
description: 'Control framework (
|
|
123
|
+
enum: ['ISO27001', 'NIST_CSF'],
|
|
124
|
+
description: 'Control framework: ISO27001 (ISO 27001:2022) or NIST_CSF (NIST Cybersecurity Framework)',
|
|
125
125
|
},
|
|
126
126
|
control: {
|
|
127
127
|
type: 'string',
|
|
128
|
-
description: 'Optional: specific control ID (e.g., "A.5.1", "
|
|
128
|
+
description: 'Optional: specific control ID (e.g., "A.5.1" for ISO27001, "PR.AC-1" for NIST CSF)',
|
|
129
129
|
},
|
|
130
130
|
regulation: {
|
|
131
131
|
type: 'string',
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/map.d.ts
CHANGED
package/dist/tools/map.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/tools/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/tools/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACzC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,wBAAsB,WAAW,CAC/B,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,cAAc,EAAE,CAAC,CA2D3B"}
|
package/dist/tools/map.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export async function mapControls(db, input) {
|
|
2
|
-
const { control, regulation } = input;
|
|
2
|
+
const { framework, control, regulation } = input;
|
|
3
3
|
let sql = `
|
|
4
4
|
SELECT
|
|
5
5
|
control_id,
|
|
@@ -9,9 +9,9 @@ export async function mapControls(db, input) {
|
|
|
9
9
|
coverage,
|
|
10
10
|
notes
|
|
11
11
|
FROM control_mappings
|
|
12
|
-
WHERE
|
|
12
|
+
WHERE framework = ?
|
|
13
13
|
`;
|
|
14
|
-
const params = [];
|
|
14
|
+
const params = [framework];
|
|
15
15
|
if (control) {
|
|
16
16
|
sql += ` AND control_id = ?`;
|
|
17
17
|
params.push(control);
|
package/dist/tools/map.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/tools/map.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAY,EACZ,KAAuB;IAEvB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/tools/map.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAY,EACZ,KAAuB;IAEvB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAEjD,IAAI,GAAG,GAAG;;;;;;;;;;GAUT,CAAC;IAEF,MAAM,MAAM,GAAa,CAAC,SAAS,CAAC,CAAC;IAErC,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,IAAI,qBAAqB,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,IAAI,qBAAqB,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IAED,GAAG,IAAI,kCAAkC,CAAC;IAE1C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAOxC,CAAC;IAEH,sBAAsB;IACtB,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;IAErD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE;gBAC7B,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;QACL,CAAC;QAED,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC5C,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClC,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;AACzC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ansvar/eu-regulations-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "The first open-source MCP server for European cybersecurity regulations. Query DORA, NIS2, GDPR, EU AI Act, and more directly from Claude.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -12,9 +12,13 @@
|
|
|
12
12
|
"test": "vitest run",
|
|
13
13
|
"test:watch": "vitest",
|
|
14
14
|
"dev": "tsx src/index.ts",
|
|
15
|
+
"dev:http": "tsx src/http-server.ts",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"start:http": "node dist/http-server.js",
|
|
15
18
|
"build:db": "tsx scripts/build-db.ts",
|
|
16
19
|
"ingest": "tsx scripts/ingest-eurlex.ts",
|
|
17
20
|
"check-updates": "tsx scripts/check-updates.ts",
|
|
21
|
+
"sync-versions": "tsx scripts/check-updates.ts --sync",
|
|
18
22
|
"lint": "eslint src --ext .ts",
|
|
19
23
|
"postinstall": "test -f dist/index.js || npm run build"
|
|
20
24
|
},
|
|
@@ -36,7 +40,7 @@
|
|
|
36
40
|
"llm"
|
|
37
41
|
],
|
|
38
42
|
"author": "Ansvar Systems <hello@ansvar.ai> (https://ansvar.ai)",
|
|
39
|
-
"license": "
|
|
43
|
+
"license": "Apache-2.0",
|
|
40
44
|
"repository": {
|
|
41
45
|
"type": "git",
|
|
42
46
|
"url": "git+https://github.com/Ansvar-Systems/EU_compliance_MCP.git"
|
package/scripts/build-db.ts
CHANGED
|
@@ -82,6 +82,7 @@ CREATE TABLE IF NOT EXISTS definitions (
|
|
|
82
82
|
-- Control mappings
|
|
83
83
|
CREATE TABLE IF NOT EXISTS control_mappings (
|
|
84
84
|
id INTEGER PRIMARY KEY,
|
|
85
|
+
framework TEXT NOT NULL DEFAULT 'ISO27001',
|
|
85
86
|
control_id TEXT NOT NULL,
|
|
86
87
|
control_name TEXT NOT NULL,
|
|
87
88
|
regulation TEXT NOT NULL REFERENCES regulations(id),
|
|
@@ -202,7 +203,7 @@ function buildDatabase() {
|
|
|
202
203
|
// Insert definitions
|
|
203
204
|
if (regulation.definitions) {
|
|
204
205
|
const insertDefinition = db.prepare(`
|
|
205
|
-
INSERT INTO definitions (regulation, term, definition, article)
|
|
206
|
+
INSERT OR IGNORE INTO definitions (regulation, term, definition, article)
|
|
206
207
|
VALUES (?, ?, ?, ?)
|
|
207
208
|
`);
|
|
208
209
|
|
|
@@ -211,11 +212,13 @@ function buildDatabase() {
|
|
|
211
212
|
}
|
|
212
213
|
}
|
|
213
214
|
|
|
214
|
-
// Update source registry
|
|
215
|
+
// Update source registry with timestamps
|
|
216
|
+
const now = new Date().toISOString();
|
|
217
|
+
const eurLexVersion = regulation.effective_date || now.split('T')[0];
|
|
215
218
|
db.prepare(`
|
|
216
|
-
INSERT INTO source_registry (regulation, celex_id, articles_expected, articles_parsed, quality_status)
|
|
217
|
-
VALUES (?, ?, ?, ?, 'complete')
|
|
218
|
-
`).run(regulation.id, regulation.celex_id, regulation.articles.length, regulation.articles.length);
|
|
219
|
+
INSERT INTO source_registry (regulation, celex_id, eur_lex_version, last_fetched, articles_expected, articles_parsed, quality_status)
|
|
220
|
+
VALUES (?, ?, ?, ?, ?, ?, 'complete')
|
|
221
|
+
`).run(regulation.id, regulation.celex_id, eurLexVersion, now, regulation.articles.length, regulation.articles.length);
|
|
219
222
|
|
|
220
223
|
console.log(` Loaded ${regulation.articles.length} articles, ${regulation.definitions?.length || 0} definitions`);
|
|
221
224
|
}
|
|
@@ -230,13 +233,22 @@ function buildDatabase() {
|
|
|
230
233
|
const content = readFileSync(join(mappingsDir, file), 'utf-8');
|
|
231
234
|
const mappings = JSON.parse(content);
|
|
232
235
|
|
|
236
|
+
// Detect framework from filename
|
|
237
|
+
let framework = 'ISO27001';
|
|
238
|
+
if (file.startsWith('nist-csf-')) {
|
|
239
|
+
framework = 'NIST_CSF';
|
|
240
|
+
} else if (file.startsWith('iso27001-')) {
|
|
241
|
+
framework = 'ISO27001';
|
|
242
|
+
}
|
|
243
|
+
|
|
233
244
|
const insertMapping = db.prepare(`
|
|
234
|
-
INSERT INTO control_mappings (control_id, control_name, regulation, articles, coverage, notes)
|
|
235
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
245
|
+
INSERT INTO control_mappings (framework, control_id, control_name, regulation, articles, coverage, notes)
|
|
246
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
236
247
|
`);
|
|
237
248
|
|
|
238
249
|
for (const mapping of mappings) {
|
|
239
250
|
insertMapping.run(
|
|
251
|
+
framework,
|
|
240
252
|
mapping.control_id,
|
|
241
253
|
mapping.control_name,
|
|
242
254
|
mapping.regulation,
|
|
@@ -246,7 +258,7 @@ function buildDatabase() {
|
|
|
246
258
|
);
|
|
247
259
|
}
|
|
248
260
|
|
|
249
|
-
console.log(` Loaded ${mappings.length} control mappings`);
|
|
261
|
+
console.log(` Loaded ${mappings.length} ${framework} control mappings`);
|
|
250
262
|
}
|
|
251
263
|
}
|
|
252
264
|
|
package/scripts/check-updates.ts
CHANGED
|
@@ -35,21 +35,10 @@ interface EurLexMetadata {
|
|
|
35
35
|
consolidatedVersions?: string[];
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
{ celex_id: '32016R0679', id: 'GDPR', name: 'General Data Protection Regulation' },
|
|
41
|
-
{ celex_id: '32022L2555', id: 'NIS2', name: 'NIS2 Directive' },
|
|
42
|
-
{ celex_id: '32022R2554', id: 'DORA', name: 'Digital Operational Resilience Act' },
|
|
43
|
-
{ celex_id: '32024R1689', id: 'AI_ACT', name: 'Artificial Intelligence Act' },
|
|
44
|
-
{ celex_id: '32024R2847', id: 'CRA', name: 'Cyber Resilience Act' },
|
|
45
|
-
{ celex_id: '32019R0881', id: 'CYBERSECURITY_ACT', name: 'EU Cybersecurity Act' },
|
|
46
|
-
];
|
|
38
|
+
// No hardcoded list - source_registry table IS the source of truth
|
|
39
|
+
// To add a new regulation: ingest it, and it's automatically monitored
|
|
47
40
|
|
|
48
41
|
async function fetchEurLexMetadata(celexId: string): Promise<EurLexMetadata | null> {
|
|
49
|
-
// Use EUR-Lex REST API to get document metadata
|
|
50
|
-
const metadataUrl = `https://eur-lex.europa.eu/search.html?SUBDOM_INIT=LEGISLATION&DB_TYPE_OF_ACT=regulation&DTS_SUBDOM=LEGISLATION&typeOfActStatus=REGULATION&qid=1&FM_CODED=REG&type=advanced&DTS_DOM=ALL&page=1&lang=en&CELEX=${celexId}`;
|
|
51
|
-
|
|
52
|
-
// Alternative: use the document info endpoint
|
|
53
42
|
const infoUrl = `https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:${celexId}`;
|
|
54
43
|
|
|
55
44
|
try {
|
|
@@ -67,19 +56,36 @@ async function fetchEurLexMetadata(celexId: string): Promise<EurLexMetadata | nu
|
|
|
67
56
|
|
|
68
57
|
const html = await response.text();
|
|
69
58
|
|
|
70
|
-
//
|
|
59
|
+
// Try multiple extraction methods in order of reliability:
|
|
60
|
+
|
|
61
|
+
// 1. ELI metadata (works for all document types including UNECE)
|
|
62
|
+
const eliDateDoc = html.match(/property="eli:date_document"[^>]*content="(\d{4}-\d{2}-\d{2})"/);
|
|
63
|
+
const eliDatePub = html.match(/property="eli:date_publication"[^>]*content="(\d{4}-\d{2}-\d{2})"/);
|
|
64
|
+
// Also try the reverse attribute order
|
|
65
|
+
const eliDateDoc2 = html.match(/content="(\d{4}-\d{2}-\d{2})"[^>]*property="eli:date_document"/);
|
|
66
|
+
const eliDatePub2 = html.match(/content="(\d{4}-\d{2}-\d{2})"[^>]*property="eli:date_publication"/);
|
|
67
|
+
|
|
68
|
+
// 2. Visible text patterns
|
|
71
69
|
const dateMatch = html.match(/Date of document:\s*(\d{2}\/\d{2}\/\d{4})/i);
|
|
72
|
-
|
|
70
|
+
|
|
71
|
+
// 3. Generic ELI date pattern (fallback)
|
|
72
|
+
const genericEli = html.match(/eli[^>]*(\d{4}-\d{2}-\d{2})/i);
|
|
73
|
+
|
|
73
74
|
const titleMatch = html.match(/<title>([^<]+)<\/title>/i);
|
|
74
75
|
|
|
75
|
-
//
|
|
76
|
-
const
|
|
76
|
+
// Use the best available date (prefer publication date for tracking updates)
|
|
77
|
+
const lastModified =
|
|
78
|
+
eliDatePub?.[1] || eliDatePub2?.[1] ||
|
|
79
|
+
eliDateDoc?.[1] || eliDateDoc2?.[1] ||
|
|
80
|
+
genericEli?.[1] ||
|
|
81
|
+
(dateMatch?.[1] ? convertDateFormat(dateMatch[1]) : null) ||
|
|
82
|
+
'unknown';
|
|
77
83
|
|
|
78
84
|
return {
|
|
79
85
|
celexId,
|
|
80
|
-
lastModified
|
|
86
|
+
lastModified,
|
|
81
87
|
title: titleMatch?.[1]?.trim() || 'Unknown',
|
|
82
|
-
dateDocument:
|
|
88
|
+
dateDocument: eliDateDoc?.[1] || eliDateDoc2?.[1] || 'unknown',
|
|
83
89
|
};
|
|
84
90
|
} catch (error) {
|
|
85
91
|
console.error(`Error fetching metadata for ${celexId}:`, error);
|
|
@@ -87,6 +93,56 @@ async function fetchEurLexMetadata(celexId: string): Promise<EurLexMetadata | nu
|
|
|
87
93
|
}
|
|
88
94
|
}
|
|
89
95
|
|
|
96
|
+
// Convert DD/MM/YYYY to YYYY-MM-DD
|
|
97
|
+
function convertDateFormat(date: string): string {
|
|
98
|
+
const parts = date.split('/');
|
|
99
|
+
if (parts.length === 3) {
|
|
100
|
+
return `${parts[2]}-${parts[1]}-${parts[0]}`;
|
|
101
|
+
}
|
|
102
|
+
return date;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Sync mode: update database with current EUR-Lex versions
|
|
106
|
+
async function syncVersions(): Promise<void> {
|
|
107
|
+
console.log('Syncing EUR-Lex versions to database...\n');
|
|
108
|
+
|
|
109
|
+
if (!existsSync(DB_PATH)) {
|
|
110
|
+
console.log('Database not found. Run `npm run build:db` first.');
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const db = new Database(DB_PATH);
|
|
115
|
+
|
|
116
|
+
const sources = db.prepare(`
|
|
117
|
+
SELECT regulation, celex_id FROM source_registry
|
|
118
|
+
WHERE celex_id IS NOT NULL AND celex_id != ''
|
|
119
|
+
`).all() as SourceRecord[];
|
|
120
|
+
|
|
121
|
+
const updateStmt = db.prepare(`
|
|
122
|
+
UPDATE source_registry SET eur_lex_version = ?, last_fetched = ?
|
|
123
|
+
WHERE regulation = ?
|
|
124
|
+
`);
|
|
125
|
+
|
|
126
|
+
const now = new Date().toISOString();
|
|
127
|
+
let updated = 0;
|
|
128
|
+
|
|
129
|
+
for (const source of sources) {
|
|
130
|
+
process.stdout.write(`${source.regulation}: `);
|
|
131
|
+
const metadata = await fetchEurLexMetadata(source.celex_id);
|
|
132
|
+
|
|
133
|
+
if (metadata && metadata.lastModified !== 'unknown') {
|
|
134
|
+
updateStmt.run(metadata.lastModified, now, source.regulation);
|
|
135
|
+
console.log(`synced to ${metadata.lastModified}`);
|
|
136
|
+
updated++;
|
|
137
|
+
} else {
|
|
138
|
+
console.log('skipped (unknown version)');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
db.close();
|
|
143
|
+
console.log(`\n✓ Synced ${updated} regulation(s)`);
|
|
144
|
+
}
|
|
145
|
+
|
|
90
146
|
async function checkForUpdates(): Promise<void> {
|
|
91
147
|
console.log('Checking EUR-Lex for regulation updates...\n');
|
|
92
148
|
|
|
@@ -98,32 +154,32 @@ async function checkForUpdates(): Promise<void> {
|
|
|
98
154
|
|
|
99
155
|
const db = new Database(DB_PATH, { readonly: true });
|
|
100
156
|
|
|
101
|
-
// Get
|
|
157
|
+
// Get all regulations from source_registry - this IS the source of truth
|
|
102
158
|
const sources = db.prepare(`
|
|
103
159
|
SELECT regulation, celex_id, eur_lex_version, last_fetched, quality_status
|
|
104
160
|
FROM source_registry
|
|
161
|
+
WHERE celex_id IS NOT NULL AND celex_id != ''
|
|
162
|
+
ORDER BY regulation
|
|
105
163
|
`).all() as SourceRecord[];
|
|
106
164
|
|
|
107
|
-
|
|
165
|
+
if (sources.length === 0) {
|
|
166
|
+
console.log('No regulations found in source_registry.');
|
|
167
|
+
console.log('Ingest regulations first with: npx tsx scripts/ingest-eurlex.ts <CELEX_ID> <output.json>');
|
|
168
|
+
db.close();
|
|
169
|
+
process.exit(0);
|
|
170
|
+
}
|
|
108
171
|
|
|
172
|
+
console.log(`Found ${sources.length} regulation(s) to check\n`);
|
|
109
173
|
console.log('Status Report');
|
|
110
174
|
console.log('='.repeat(80));
|
|
111
175
|
|
|
112
176
|
const updates: Array<{ id: string; celex_id: string; reason: string }> = [];
|
|
113
177
|
|
|
114
|
-
for (const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
process.stdout.write(`\n${reg.id.padEnd(20)} (${reg.celex_id}): `);
|
|
118
|
-
|
|
119
|
-
if (!source) {
|
|
120
|
-
console.log('NOT INGESTED');
|
|
121
|
-
updates.push({ id: reg.id, celex_id: reg.celex_id, reason: 'Not yet ingested' });
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
178
|
+
for (const source of sources) {
|
|
179
|
+
process.stdout.write(`\n${source.regulation.padEnd(20)} (${source.celex_id}): `);
|
|
124
180
|
|
|
125
181
|
// Fetch current EUR-Lex metadata
|
|
126
|
-
const metadata = await fetchEurLexMetadata(
|
|
182
|
+
const metadata = await fetchEurLexMetadata(source.celex_id);
|
|
127
183
|
|
|
128
184
|
if (!metadata) {
|
|
129
185
|
console.log('FETCH FAILED');
|
|
@@ -133,16 +189,48 @@ async function checkForUpdates(): Promise<void> {
|
|
|
133
189
|
const lastFetched = source.last_fetched || 'never';
|
|
134
190
|
const eurLexVersion = metadata.lastModified;
|
|
135
191
|
|
|
136
|
-
|
|
192
|
+
// Helper to compare dates (returns true if eurLex is newer)
|
|
193
|
+
const isNewer = (eurLex: string, local: string): boolean => {
|
|
194
|
+
if (eurLex === 'unknown' || !eurLex) return false;
|
|
195
|
+
try {
|
|
196
|
+
const eurLexDate = new Date(eurLex);
|
|
197
|
+
const localDate = new Date(local);
|
|
198
|
+
return eurLexDate > localDate;
|
|
199
|
+
} catch {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
if (eurLexVersion === 'unknown') {
|
|
205
|
+
// UNECE or non-standard documents - can't auto-check
|
|
206
|
+
console.log('MANUAL CHECK REQUIRED');
|
|
207
|
+
console.log(` Source type: Non-standard (UNECE/consolidated)`);
|
|
208
|
+
console.log(` Last fetched: ${lastFetched}`);
|
|
209
|
+
} else if (!source.eur_lex_version) {
|
|
210
|
+
// First time checking - record the version but don't flag as update
|
|
211
|
+
console.log('VERSION NOT TRACKED');
|
|
212
|
+
console.log(` EUR-Lex version: ${eurLexVersion}`);
|
|
213
|
+
console.log(` Run ingest again to record version`);
|
|
214
|
+
} else if (isNewer(eurLexVersion, source.eur_lex_version)) {
|
|
215
|
+
// EUR-Lex has a newer version
|
|
137
216
|
console.log('UPDATE AVAILABLE');
|
|
138
217
|
console.log(` Local version: ${source.eur_lex_version}`);
|
|
139
218
|
console.log(` EUR-Lex version: ${eurLexVersion}`);
|
|
140
|
-
updates.push({
|
|
219
|
+
updates.push({
|
|
220
|
+
id: source.regulation,
|
|
221
|
+
celex_id: source.celex_id,
|
|
222
|
+
reason: `Newer version: ${source.eur_lex_version} -> ${eurLexVersion}`
|
|
223
|
+
});
|
|
141
224
|
} else if (source.quality_status !== 'complete') {
|
|
142
225
|
console.log(`INCOMPLETE (${source.quality_status})`);
|
|
143
|
-
updates.push({
|
|
226
|
+
updates.push({
|
|
227
|
+
id: source.regulation,
|
|
228
|
+
celex_id: source.celex_id,
|
|
229
|
+
reason: `Quality status: ${source.quality_status}`
|
|
230
|
+
});
|
|
144
231
|
} else {
|
|
145
232
|
console.log('UP TO DATE');
|
|
233
|
+
console.log(` EUR-Lex version: ${eurLexVersion}`);
|
|
146
234
|
console.log(` Last fetched: ${lastFetched}`);
|
|
147
235
|
}
|
|
148
236
|
}
|
|
@@ -168,6 +256,10 @@ async function checkForUpdates(): Promise<void> {
|
|
|
168
256
|
}
|
|
169
257
|
console.log('\nThen: npm run build:db');
|
|
170
258
|
}
|
|
259
|
+
|
|
260
|
+
// Output for CI: write CELEX IDs to file for workflow to use
|
|
261
|
+
const celexList = sources.map(s => s.celex_id).join('|');
|
|
262
|
+
console.log(`\n::set-output name=celex_pattern::${celexList}`);
|
|
171
263
|
}
|
|
172
264
|
|
|
173
265
|
// Also provide a function to update the source registry after ingestion
|
|
@@ -186,7 +278,17 @@ export async function updateSourceRegistry(
|
|
|
186
278
|
`).run(regulation, celexId, now.split('T')[0], now, articleCount, articleCount);
|
|
187
279
|
}
|
|
188
280
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
281
|
+
// Main execution
|
|
282
|
+
const args = process.argv.slice(2);
|
|
283
|
+
|
|
284
|
+
if (args.includes('--sync')) {
|
|
285
|
+
syncVersions().catch(err => {
|
|
286
|
+
console.error('Error:', err);
|
|
287
|
+
process.exit(1);
|
|
288
|
+
});
|
|
289
|
+
} else {
|
|
290
|
+
checkForUpdates().catch(err => {
|
|
291
|
+
console.error('Error:', err);
|
|
292
|
+
process.exit(1);
|
|
293
|
+
});
|
|
294
|
+
}
|
package/scripts/ingest-eurlex.ts
CHANGED
|
@@ -40,6 +40,14 @@ const REGULATION_METADATA: Record<string, { id: string; full_name: string; effec
|
|
|
40
40
|
'32024R1689': { id: 'AI_ACT', full_name: 'Artificial Intelligence Act', effective_date: '2024-08-01' },
|
|
41
41
|
'32024R2847': { id: 'CRA', full_name: 'Cyber Resilience Act', effective_date: '2024-12-10' },
|
|
42
42
|
'32019R0881': { id: 'CYBERSECURITY_ACT', full_name: 'EU Cybersecurity Act', effective_date: '2019-06-27' },
|
|
43
|
+
'32024R1183': { id: 'EIDAS2', full_name: 'European Digital Identity Framework (eIDAS 2.0)', effective_date: '2024-05-20' },
|
|
44
|
+
// Digital Single Market regulations
|
|
45
|
+
'32023R2854': { id: 'DATA_ACT', full_name: 'Data Act', effective_date: '2025-09-12' },
|
|
46
|
+
'32022R2065': { id: 'DSA', full_name: 'Digital Services Act', effective_date: '2024-02-17' },
|
|
47
|
+
'32022R1925': { id: 'DMA', full_name: 'Digital Markets Act', effective_date: '2023-05-02' },
|
|
48
|
+
// UN Regulations (adopted by EU)
|
|
49
|
+
'42021X0387': { id: 'UN_R155', full_name: 'UN Regulation No. 155 - Cyber security and cyber security management system', effective_date: '2021-01-22' },
|
|
50
|
+
'42025X0005': { id: 'UN_R155', full_name: 'UN Regulation No. 155 - Cyber security and cyber security management system (Supplement 3)', effective_date: '2025-01-10' },
|
|
43
51
|
};
|
|
44
52
|
|
|
45
53
|
async function fetchEurLexHtml(celexId: string): Promise<string> {
|
|
@@ -189,7 +197,7 @@ async function ingestRegulation(celexId: string, outputPath: string): Promise<vo
|
|
|
189
197
|
full_name: metadata?.full_name || `Regulation ${celexId}`,
|
|
190
198
|
celex_id: celexId,
|
|
191
199
|
effective_date: metadata?.effective_date,
|
|
192
|
-
eur_lex_url: `https://eur-lex.europa.eu/
|
|
200
|
+
eur_lex_url: `https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:${celexId}`,
|
|
193
201
|
articles,
|
|
194
202
|
definitions,
|
|
195
203
|
};
|