euparliamentmonitor 0.8.4

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 (276) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +1005 -0
  3. package/SECURITY.md +151 -0
  4. package/package.json +131 -0
  5. package/scripts/constants/committee-indicator-map.d.ts +199 -0
  6. package/scripts/constants/committee-indicator-map.d.ts.map +1 -0
  7. package/scripts/constants/committee-indicator-map.js +1224 -0
  8. package/scripts/constants/committee-indicator-map.js.map +1 -0
  9. package/scripts/constants/config.d.ts +38 -0
  10. package/scripts/constants/config.d.ts.map +1 -0
  11. package/scripts/constants/config.js +66 -0
  12. package/scripts/constants/config.js.map +1 -0
  13. package/scripts/constants/language-articles.d.ts +84 -0
  14. package/scripts/constants/language-articles.d.ts.map +1 -0
  15. package/scripts/constants/language-articles.js +6771 -0
  16. package/scripts/constants/language-articles.js.map +1 -0
  17. package/scripts/constants/language-core.d.ts +38 -0
  18. package/scripts/constants/language-core.d.ts.map +1 -0
  19. package/scripts/constants/language-core.js +90 -0
  20. package/scripts/constants/language-core.js.map +1 -0
  21. package/scripts/constants/language-ui.d.ts +82 -0
  22. package/scripts/constants/language-ui.d.ts.map +1 -0
  23. package/scripts/constants/language-ui.js +889 -0
  24. package/scripts/constants/language-ui.js.map +1 -0
  25. package/scripts/constants/languages.d.ts +14 -0
  26. package/scripts/constants/languages.d.ts.map +1 -0
  27. package/scripts/constants/languages.js +15 -0
  28. package/scripts/constants/languages.js.map +1 -0
  29. package/scripts/generators/analysis-builders.d.ts +266 -0
  30. package/scripts/generators/analysis-builders.d.ts.map +1 -0
  31. package/scripts/generators/analysis-builders.js +2903 -0
  32. package/scripts/generators/analysis-builders.js.map +1 -0
  33. package/scripts/generators/breaking-content.d.ts +45 -0
  34. package/scripts/generators/breaking-content.d.ts.map +1 -0
  35. package/scripts/generators/breaking-content.js +530 -0
  36. package/scripts/generators/breaking-content.js.map +1 -0
  37. package/scripts/generators/committee-helpers.d.ts +54 -0
  38. package/scripts/generators/committee-helpers.d.ts.map +1 -0
  39. package/scripts/generators/committee-helpers.js +154 -0
  40. package/scripts/generators/committee-helpers.js.map +1 -0
  41. package/scripts/generators/dashboard-content.d.ts +95 -0
  42. package/scripts/generators/dashboard-content.d.ts.map +1 -0
  43. package/scripts/generators/dashboard-content.js +630 -0
  44. package/scripts/generators/dashboard-content.js.map +1 -0
  45. package/scripts/generators/deep-analysis-content.d.ts +23 -0
  46. package/scripts/generators/deep-analysis-content.d.ts.map +1 -0
  47. package/scripts/generators/deep-analysis-content.js +831 -0
  48. package/scripts/generators/deep-analysis-content.js.map +1 -0
  49. package/scripts/generators/mindmap-content.d.ts +55 -0
  50. package/scripts/generators/mindmap-content.d.ts.map +1 -0
  51. package/scripts/generators/mindmap-content.js +512 -0
  52. package/scripts/generators/mindmap-content.js.map +1 -0
  53. package/scripts/generators/motions-content.d.ts +50 -0
  54. package/scripts/generators/motions-content.d.ts.map +1 -0
  55. package/scripts/generators/motions-content.js +391 -0
  56. package/scripts/generators/motions-content.js.map +1 -0
  57. package/scripts/generators/news-enhanced.d.ts +14 -0
  58. package/scripts/generators/news-enhanced.d.ts.map +1 -0
  59. package/scripts/generators/news-enhanced.js +169 -0
  60. package/scripts/generators/news-enhanced.js.map +1 -0
  61. package/scripts/generators/news-indexes.d.ts +31 -0
  62. package/scripts/generators/news-indexes.d.ts.map +1 -0
  63. package/scripts/generators/news-indexes.js +410 -0
  64. package/scripts/generators/news-indexes.js.map +1 -0
  65. package/scripts/generators/pipeline/fetch-stage.d.ts +352 -0
  66. package/scripts/generators/pipeline/fetch-stage.d.ts.map +1 -0
  67. package/scripts/generators/pipeline/fetch-stage.js +1522 -0
  68. package/scripts/generators/pipeline/fetch-stage.js.map +1 -0
  69. package/scripts/generators/pipeline/generate-stage.d.ts +43 -0
  70. package/scripts/generators/pipeline/generate-stage.d.ts.map +1 -0
  71. package/scripts/generators/pipeline/generate-stage.js +204 -0
  72. package/scripts/generators/pipeline/generate-stage.js.map +1 -0
  73. package/scripts/generators/pipeline/output-stage.d.ts +48 -0
  74. package/scripts/generators/pipeline/output-stage.d.ts.map +1 -0
  75. package/scripts/generators/pipeline/output-stage.js +145 -0
  76. package/scripts/generators/pipeline/output-stage.js.map +1 -0
  77. package/scripts/generators/pipeline/transform-stage.d.ts +57 -0
  78. package/scripts/generators/pipeline/transform-stage.d.ts.map +1 -0
  79. package/scripts/generators/pipeline/transform-stage.js +111 -0
  80. package/scripts/generators/pipeline/transform-stage.js.map +1 -0
  81. package/scripts/generators/propositions-content.d.ts +29 -0
  82. package/scripts/generators/propositions-content.d.ts.map +1 -0
  83. package/scripts/generators/propositions-content.js +90 -0
  84. package/scripts/generators/propositions-content.js.map +1 -0
  85. package/scripts/generators/sankey-content.d.ts +45 -0
  86. package/scripts/generators/sankey-content.d.ts.map +1 -0
  87. package/scripts/generators/sankey-content.js +227 -0
  88. package/scripts/generators/sankey-content.js.map +1 -0
  89. package/scripts/generators/sitemap.d.ts +66 -0
  90. package/scripts/generators/sitemap.d.ts.map +1 -0
  91. package/scripts/generators/sitemap.js +562 -0
  92. package/scripts/generators/sitemap.js.map +1 -0
  93. package/scripts/generators/strategies/article-strategy.d.ts +146 -0
  94. package/scripts/generators/strategies/article-strategy.d.ts.map +1 -0
  95. package/scripts/generators/strategies/article-strategy.js +4 -0
  96. package/scripts/generators/strategies/article-strategy.js.map +1 -0
  97. package/scripts/generators/strategies/breaking-news-strategy.d.ts +64 -0
  98. package/scripts/generators/strategies/breaking-news-strategy.d.ts.map +1 -0
  99. package/scripts/generators/strategies/breaking-news-strategy.js +246 -0
  100. package/scripts/generators/strategies/breaking-news-strategy.js.map +1 -0
  101. package/scripts/generators/strategies/committee-reports-strategy.d.ts +93 -0
  102. package/scripts/generators/strategies/committee-reports-strategy.d.ts.map +1 -0
  103. package/scripts/generators/strategies/committee-reports-strategy.js +447 -0
  104. package/scripts/generators/strategies/committee-reports-strategy.js.map +1 -0
  105. package/scripts/generators/strategies/month-ahead-strategy.d.ts +60 -0
  106. package/scripts/generators/strategies/month-ahead-strategy.d.ts.map +1 -0
  107. package/scripts/generators/strategies/month-ahead-strategy.js +175 -0
  108. package/scripts/generators/strategies/month-ahead-strategy.js.map +1 -0
  109. package/scripts/generators/strategies/monthly-review-strategy.d.ts +66 -0
  110. package/scripts/generators/strategies/monthly-review-strategy.d.ts.map +1 -0
  111. package/scripts/generators/strategies/monthly-review-strategy.js +204 -0
  112. package/scripts/generators/strategies/monthly-review-strategy.js.map +1 -0
  113. package/scripts/generators/strategies/motions-strategy.d.ts +61 -0
  114. package/scripts/generators/strategies/motions-strategy.d.ts.map +1 -0
  115. package/scripts/generators/strategies/motions-strategy.js +215 -0
  116. package/scripts/generators/strategies/motions-strategy.js.map +1 -0
  117. package/scripts/generators/strategies/propositions-strategy.d.ts +60 -0
  118. package/scripts/generators/strategies/propositions-strategy.d.ts.map +1 -0
  119. package/scripts/generators/strategies/propositions-strategy.js +257 -0
  120. package/scripts/generators/strategies/propositions-strategy.js.map +1 -0
  121. package/scripts/generators/strategies/week-ahead-strategy.d.ts +57 -0
  122. package/scripts/generators/strategies/week-ahead-strategy.d.ts.map +1 -0
  123. package/scripts/generators/strategies/week-ahead-strategy.js +178 -0
  124. package/scripts/generators/strategies/week-ahead-strategy.js.map +1 -0
  125. package/scripts/generators/strategies/weekly-review-strategy.d.ts +63 -0
  126. package/scripts/generators/strategies/weekly-review-strategy.d.ts.map +1 -0
  127. package/scripts/generators/strategies/weekly-review-strategy.js +211 -0
  128. package/scripts/generators/strategies/weekly-review-strategy.js.map +1 -0
  129. package/scripts/generators/swot-content.d.ts +42 -0
  130. package/scripts/generators/swot-content.d.ts.map +1 -0
  131. package/scripts/generators/swot-content.js +366 -0
  132. package/scripts/generators/swot-content.js.map +1 -0
  133. package/scripts/generators/week-ahead-content.d.ts +103 -0
  134. package/scripts/generators/week-ahead-content.d.ts.map +1 -0
  135. package/scripts/generators/week-ahead-content.js +610 -0
  136. package/scripts/generators/week-ahead-content.js.map +1 -0
  137. package/scripts/index.d.ts +40 -0
  138. package/scripts/index.d.ts.map +1 -0
  139. package/scripts/index.js +53 -0
  140. package/scripts/index.js.map +1 -0
  141. package/scripts/mcp/ep-mcp-client.d.ts +471 -0
  142. package/scripts/mcp/ep-mcp-client.d.ts.map +1 -0
  143. package/scripts/mcp/ep-mcp-client.js +734 -0
  144. package/scripts/mcp/ep-mcp-client.js.map +1 -0
  145. package/scripts/mcp/mcp-connection.d.ts +264 -0
  146. package/scripts/mcp/mcp-connection.d.ts.map +1 -0
  147. package/scripts/mcp/mcp-connection.js +790 -0
  148. package/scripts/mcp/mcp-connection.js.map +1 -0
  149. package/scripts/mcp/mcp-health.d.ts +75 -0
  150. package/scripts/mcp/mcp-health.d.ts.map +1 -0
  151. package/scripts/mcp/mcp-health.js +78 -0
  152. package/scripts/mcp/mcp-health.js.map +1 -0
  153. package/scripts/mcp/mcp-retry.d.ts +94 -0
  154. package/scripts/mcp/mcp-retry.d.ts.map +1 -0
  155. package/scripts/mcp/mcp-retry.js +127 -0
  156. package/scripts/mcp/mcp-retry.js.map +1 -0
  157. package/scripts/mcp/wb-mcp-client.d.ts +38 -0
  158. package/scripts/mcp/wb-mcp-client.d.ts.map +1 -0
  159. package/scripts/mcp/wb-mcp-client.js +112 -0
  160. package/scripts/mcp/wb-mcp-client.js.map +1 -0
  161. package/scripts/templates/article-template.d.ts +9 -0
  162. package/scripts/templates/article-template.d.ts.map +1 -0
  163. package/scripts/templates/article-template.js +378 -0
  164. package/scripts/templates/article-template.js.map +1 -0
  165. package/scripts/templates/section-builders.d.ts +28 -0
  166. package/scripts/templates/section-builders.d.ts.map +1 -0
  167. package/scripts/templates/section-builders.js +142 -0
  168. package/scripts/templates/section-builders.js.map +1 -0
  169. package/scripts/types/analysis.d.ts +115 -0
  170. package/scripts/types/analysis.d.ts.map +1 -0
  171. package/scripts/types/analysis.js +4 -0
  172. package/scripts/types/analysis.js.map +1 -0
  173. package/scripts/types/common.d.ts +584 -0
  174. package/scripts/types/common.d.ts.map +1 -0
  175. package/scripts/types/common.js +96 -0
  176. package/scripts/types/common.js.map +1 -0
  177. package/scripts/types/generation.d.ts +104 -0
  178. package/scripts/types/generation.d.ts.map +1 -0
  179. package/scripts/types/generation.js +4 -0
  180. package/scripts/types/generation.js.map +1 -0
  181. package/scripts/types/index.d.ts +24 -0
  182. package/scripts/types/index.d.ts.map +1 -0
  183. package/scripts/types/index.js +16 -0
  184. package/scripts/types/index.js.map +1 -0
  185. package/scripts/types/intelligence.d.ts +129 -0
  186. package/scripts/types/intelligence.d.ts.map +1 -0
  187. package/scripts/types/intelligence.js +4 -0
  188. package/scripts/types/intelligence.js.map +1 -0
  189. package/scripts/types/mcp.d.ts +418 -0
  190. package/scripts/types/mcp.d.ts.map +1 -0
  191. package/scripts/types/mcp.js +4 -0
  192. package/scripts/types/mcp.js.map +1 -0
  193. package/scripts/types/parliament.d.ts +388 -0
  194. package/scripts/types/parliament.d.ts.map +1 -0
  195. package/scripts/types/parliament.js +4 -0
  196. package/scripts/types/parliament.js.map +1 -0
  197. package/scripts/types/quality.d.ts +114 -0
  198. package/scripts/types/quality.d.ts.map +1 -0
  199. package/scripts/types/quality.js +4 -0
  200. package/scripts/types/quality.js.map +1 -0
  201. package/scripts/types/stakeholder.d.ts +88 -0
  202. package/scripts/types/stakeholder.d.ts.map +1 -0
  203. package/scripts/types/stakeholder.js +16 -0
  204. package/scripts/types/stakeholder.js.map +1 -0
  205. package/scripts/types/visualization.d.ts +708 -0
  206. package/scripts/types/visualization.d.ts.map +1 -0
  207. package/scripts/types/visualization.js +4 -0
  208. package/scripts/types/visualization.js.map +1 -0
  209. package/scripts/types/world-bank.d.ts +85 -0
  210. package/scripts/types/world-bank.d.ts.map +1 -0
  211. package/scripts/types/world-bank.js +4 -0
  212. package/scripts/types/world-bank.js.map +1 -0
  213. package/scripts/utils/article-category.d.ts +18 -0
  214. package/scripts/utils/article-category.d.ts.map +1 -0
  215. package/scripts/utils/article-category.js +49 -0
  216. package/scripts/utils/article-category.js.map +1 -0
  217. package/scripts/utils/article-quality-scorer.d.ts +87 -0
  218. package/scripts/utils/article-quality-scorer.d.ts.map +1 -0
  219. package/scripts/utils/article-quality-scorer.js +1048 -0
  220. package/scripts/utils/article-quality-scorer.js.map +1 -0
  221. package/scripts/utils/content-metadata.d.ts +34 -0
  222. package/scripts/utils/content-metadata.d.ts.map +1 -0
  223. package/scripts/utils/content-metadata.js +249 -0
  224. package/scripts/utils/content-metadata.js.map +1 -0
  225. package/scripts/utils/content-validator.d.ts +94 -0
  226. package/scripts/utils/content-validator.d.ts.map +1 -0
  227. package/scripts/utils/content-validator.js +489 -0
  228. package/scripts/utils/content-validator.js.map +1 -0
  229. package/scripts/utils/copy-test-reports.d.ts +9 -0
  230. package/scripts/utils/copy-test-reports.d.ts.map +1 -0
  231. package/scripts/utils/copy-test-reports.js +508 -0
  232. package/scripts/utils/copy-test-reports.js.map +1 -0
  233. package/scripts/utils/file-utils.d.ts +144 -0
  234. package/scripts/utils/file-utils.d.ts.map +1 -0
  235. package/scripts/utils/file-utils.js +374 -0
  236. package/scripts/utils/file-utils.js.map +1 -0
  237. package/scripts/utils/fix-articles.d.ts +27 -0
  238. package/scripts/utils/fix-articles.d.ts.map +1 -0
  239. package/scripts/utils/fix-articles.js +510 -0
  240. package/scripts/utils/fix-articles.js.map +1 -0
  241. package/scripts/utils/generate-docs-index.d.ts +8 -0
  242. package/scripts/utils/generate-docs-index.d.ts.map +1 -0
  243. package/scripts/utils/generate-docs-index.js +275 -0
  244. package/scripts/utils/generate-docs-index.js.map +1 -0
  245. package/scripts/utils/html-sanitize.d.ts +18 -0
  246. package/scripts/utils/html-sanitize.d.ts.map +1 -0
  247. package/scripts/utils/html-sanitize.js +57 -0
  248. package/scripts/utils/html-sanitize.js.map +1 -0
  249. package/scripts/utils/intelligence-analysis.d.ts +173 -0
  250. package/scripts/utils/intelligence-analysis.d.ts.map +1 -0
  251. package/scripts/utils/intelligence-analysis.js +936 -0
  252. package/scripts/utils/intelligence-analysis.js.map +1 -0
  253. package/scripts/utils/intelligence-index.d.ts +126 -0
  254. package/scripts/utils/intelligence-index.d.ts.map +1 -0
  255. package/scripts/utils/intelligence-index.js +731 -0
  256. package/scripts/utils/intelligence-index.js.map +1 -0
  257. package/scripts/utils/metadata-utils.d.ts +14 -0
  258. package/scripts/utils/metadata-utils.d.ts.map +1 -0
  259. package/scripts/utils/metadata-utils.js +18 -0
  260. package/scripts/utils/metadata-utils.js.map +1 -0
  261. package/scripts/utils/news-metadata.d.ts +47 -0
  262. package/scripts/utils/news-metadata.d.ts.map +1 -0
  263. package/scripts/utils/news-metadata.js +259 -0
  264. package/scripts/utils/news-metadata.js.map +1 -0
  265. package/scripts/utils/validate-articles.d.ts +2 -0
  266. package/scripts/utils/validate-articles.d.ts.map +1 -0
  267. package/scripts/utils/validate-articles.js +284 -0
  268. package/scripts/utils/validate-articles.js.map +1 -0
  269. package/scripts/utils/validate-ep-api.d.ts +51 -0
  270. package/scripts/utils/validate-ep-api.d.ts.map +1 -0
  271. package/scripts/utils/validate-ep-api.js +160 -0
  272. package/scripts/utils/validate-ep-api.js.map +1 -0
  273. package/scripts/utils/world-bank-data.d.ts +84 -0
  274. package/scripts/utils/world-bank-data.d.ts.map +1 -0
  275. package/scripts/utils/world-bank-data.js +311 -0
  276. package/scripts/utils/world-bank-data.js.map +1 -0
package/README.md ADDED
@@ -0,0 +1,1005 @@
1
+ <p align="center">
2
+ <img src="https://hack23.com/icon-192.png" alt="Hack23 Logo" width="192" height="192">
3
+ </p>
4
+
5
+ <h1 align="center">🏛️ EU Parliament Monitor</h1>
6
+
7
+ <p align="center">
8
+ <strong>European Parliament Intelligence Platform</strong><br>
9
+ <em>Monitor political activity with systematic transparency</em>
10
+ </p>
11
+
12
+ <p align="center">
13
+ <a href="#"><img src="https://img.shields.io/badge/Owner-CEO-0A66C2?style=for-the-badge" alt="Owner"/></a>
14
+ <a href="#"><img src="https://img.shields.io/badge/Version-1.0-555?style=for-the-badge" alt="Version"/></a>
15
+ <a href="#"><img src="https://img.shields.io/badge/Classification-Public-success?style=for-the-badge" alt="Classification"/></a>
16
+ <a href="#"><img src="https://img.shields.io/badge/Review-Annual-orange?style=for-the-badge" alt="Review Cycle"/></a>
17
+ </p>
18
+
19
+ <table>
20
+ <tr>
21
+ <td width="120" align="center">
22
+ <img src="https://img.shields.io/badge/EU-Parliament-003399?style=for-the-badge&logo=european-union&logoColor=FFCC00" width="80" alt="EU Parliament Monitor"/>
23
+ <div>
24
+ <a href="https://github.com/Hack23/euparliamentmonitor">
25
+ <img src="https://img.shields.io/github/v/release/Hack23/euparliamentmonitor" alt="Release">
26
+ </a>
27
+ </div>
28
+ </td>
29
+ <td>
30
+ <p><strong>European Parliament Intelligence Platform</strong> — an automated multi-language news platform that monitors EU Parliament activities with 14-language support, covering plenary sessions, committee reports, propositions, and breaking news.</p>
31
+ <div>
32
+ <a href="https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor">
33
+ <img src="https://api.securityscorecards.dev/projects/github.com/Hack23/euparliamentmonitor/badge" alt="OpenSSF Scorecard">
34
+ </a>
35
+ <a href="https://www.bestpractices.dev/projects/12068">
36
+ <img src="https://www.bestpractices.dev/projects/12068/badge" alt="OpenSSF Best Practices">
37
+ </a>
38
+ <a href="https://github.com/Hack23/euparliamentmonitor/attestations">
39
+ <img src="https://slsa.dev/images/gh-badge-level3.svg" alt="SLSA 3">
40
+ </a>
41
+ <a href="https://github.com/Hack23/euparliamentmonitor/license">
42
+ <img src="https://img.shields.io/github/license/Hack23/euparliamentmonitor" alt="License">
43
+ </a>
44
+ </div>
45
+ <div>
46
+ <a href="https://github.com/Hack23/euparliamentmonitor"><strong>📂 Repository</strong></a> •
47
+ <a href="https://hack23.com/euparliamentmonitor-features.html"><strong>✨ Features</strong></a> •
48
+ <a href="https://hack23.com/euparliamentmonitor-docs.html"><strong>📚 Documentation</strong></a>
49
+ </div>
50
+ </td>
51
+ </tr>
52
+ </table>
53
+
54
+ [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/Hack23/euparliamentmonitor/badge)](https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor)
55
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/12068/badge)](https://www.bestpractices.dev/projects/12068)
56
+ [![SLSA 3](https://slsa.dev/images/gh-badge-level3.svg)](https://github.com/Hack23/euparliamentmonitor/attestations)
57
+ [![News Generation](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml)
58
+ [![Test and Report](https://github.com/Hack23/euparliamentmonitor/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/test-and-report.yml)
59
+ [![License](https://img.shields.io/github/license/Hack23/euparliamentmonitor)](https://github.com/Hack23/euparliamentmonitor/blob/main/LICENSE)
60
+ [![ISMS](https://img.shields.io/badge/Hack23-ISMS-blue)](https://github.com/Hack23/ISMS-PUBLIC)
61
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/Hack23/euparliamentmonitor)
62
+
63
+
64
+
65
+ ## 🎯 Status Badges
66
+
67
+ ### Workflow Status
68
+ [![News Generation](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml)
69
+ [![CodeQL](https://github.com/Hack23/euparliamentmonitor/actions/workflows/codeql.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/codeql.yml)
70
+ [![Test and Report](https://github.com/Hack23/euparliamentmonitor/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/test-and-report.yml)
71
+ [![Release](https://github.com/Hack23/euparliamentmonitor/actions/workflows/release.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/release.yml)
72
+ [![E2E Tests](https://github.com/Hack23/euparliamentmonitor/actions/workflows/e2e.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/e2e.yml)
73
+ [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/Hack23/euparliamentmonitor/badge)](https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor)
74
+
75
+ ### Documentation & Reports
76
+ [![API Docs](https://img.shields.io/badge/API-Documentation-blue?logo=javascript)](https://euparliamentmonitor.com/docs/api/index.html)
77
+ [![Coverage](https://img.shields.io/badge/Coverage-82%25-green?logo=vitest)](https://euparliamentmonitor.com/docs/coverage/index.html)
78
+ [![E2E Report](https://img.shields.io/badge/E2E-Report-purple?logo=playwright)](https://euparliamentmonitor.com/playwright-report/index.html)
79
+ [![SLSA 3](https://img.shields.io/badge/SLSA-Level%203-brightgreen?logo=github)](https://github.com/Hack23/euparliamentmonitor/attestations)
80
+
81
+ ## 📚 Documentation Hub
82
+
83
+ **📖 Quick Links:**
84
+ - [📘 Architecture Documentation](SECURITY_ARCHITECTURE.md) - Complete security architecture with C4 diagrams
85
+ - [📗 Security Flows](FLOWCHART.md) - Process flows with security controls
86
+ - [📙 Data Model](DATA_MODEL.md) - Data structures and API integration
87
+ - [📕 Release Process](docs/RELEASE_PROCESS.md) - How to create releases
88
+ - [📔 API Documentation](https://euparliamentmonitor.com/docs/api/index.html) - TypeDoc-generated API reference
89
+ - [📓 Test Coverage](https://euparliamentmonitor.com/docs/coverage/index.html) - Interactive coverage report
90
+
91
+ **🔒 ISMS Compliance:**
92
+ - [🛡️ Hack23 ISMS Framework](https://github.com/Hack23/ISMS-PUBLIC) - Information Security Management System
93
+ - [🔐 Secure Development Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md) - Development standards
94
+ - [📋 Classification Framework](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) - CIA triad classification
95
+
96
+ ## Current Status
97
+
98
+ **MCP Server Integration**: The project is designed to use the
99
+ [European-Parliament-MCP-Server](https://github.com/Hack23/European-Parliament-MCP-Server)
100
+ for accessing real EU Parliament data.
101
+
102
+ - **MCP Server Status**: The MCP server is currently in development (skeleton
103
+ implementation)
104
+ - **Fallback Mode**: News generation works with placeholder content when MCP
105
+ server is unavailable
106
+ - **Environment Variable**: Set `USE_EP_MCP=false` to disable MCP client
107
+ connection attempts
108
+
109
+ ### When MCP Server is Ready
110
+
111
+ Once the European-Parliament-MCP-Server is fully implemented, the system will
112
+ automatically:
113
+
114
+ 1. Connect to the MCP server for real-time EU Parliament data
115
+ 2. Fetch plenary sessions, committee meetings, and documents
116
+ 3. Generate articles with actual parliamentary information
117
+ 4. Provide proper translation or content generation in each language
118
+
119
+ ### Current Limitations
120
+
121
+ **Note**: The current implementation generates placeholder content in English
122
+ for all languages when MCP server is unavailable. To enable full functionality:
123
+
124
+ 1. **Complete the MCP Server**: The European-Parliament-MCP-Server needs
125
+ implementation of:
126
+ - `get_plenary_sessions` tool
127
+ - `search_documents` tool
128
+ - `get_parliamentary_questions` tool
129
+ - `get_committee_info` tool
130
+
131
+ 2. **Install MCP Server**: Once ready, install the MCP server:
132
+
133
+ ```bash
134
+ npm install -g european-parliament-mcp-server
135
+ # or clone and build locally
136
+ ```
137
+
138
+ 3. **Enable MCP Client**: The news generator will automatically connect when the
139
+ server is available
140
+
141
+ EU Parliament Monitor is an automated news generation platform that monitors
142
+ European Parliament activities and generates multi-language news articles
143
+ covering:
144
+
145
+ - **Week Ahead**: Preview of upcoming parliamentary events and committee
146
+ meetings
147
+ - **Committee Reports**: Analysis of committee activities and decisions
148
+ - **Propositions**: Government and parliamentary legislative proposals
149
+ - **Motions**: Parliamentary motions and resolutions
150
+ - **Breaking News**: Rapid-response coverage of significant developments
151
+
152
+ ## Features
153
+
154
+ - 📰 **Automated News Generation**: Generate news articles about EU Parliament
155
+ activities
156
+ - 🌍 **Multi-Language Support**: 14 languages including English, Swedish, German,
157
+ French, Spanish, Arabic, Japanese, and more
158
+ - 📅 **Week Ahead Coverage**: Preview upcoming parliamentary events
159
+ - 🤖 **GitHub Actions Integration**: Automated daily news generation
160
+ - 📊 **SEO Optimized**: Proper metadata, structured data, and sitemap generation
161
+ - ✅ **Code Quality**: ESLint, Prettier, and automated quality gates
162
+
163
+ ## 🔒 Security Architecture
164
+
165
+ EU Parliament Monitor implements **security-by-design** with comprehensive
166
+ security controls and ISMS compliance.
167
+
168
+ ### Security Documentation
169
+
170
+ - 📋 **[Security Architecture](SECURITY_ARCHITECTURE.md)** - Complete security
171
+ implementation overview with C4 diagrams, threat model, and compliance mapping
172
+ - 🚀 **[Future Security Architecture](FUTURE_SECURITY_ARCHITECTURE.md)** -
173
+ Security enhancement roadmap (2026-2027)
174
+ - 📊 **[Data Model](DATA_MODEL.md)** - Data structures and European Parliament
175
+ API integration
176
+ - 📈 **[Security Flowcharts](FLOWCHART.md)** - Detailed process flows with
177
+ security controls
178
+
179
+ ### Security Posture
180
+
181
+ **Project Classification** (per
182
+ [ISMS Classification Framework](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) and
183
+ [Open Source Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Open_Source_Policy.md)):
184
+
185
+ - **Confidentiality**: Public (Level 1) - European Parliament open data
186
+ - **Integrity**: Medium (Level 2) - News accuracy critical for democratic
187
+ transparency
188
+ - **Availability**: Medium (Level 2) - Daily updates expected, 24h RTO acceptable
189
+ - **RTO**: 24 hours | **RPO**: 1 day (daily generation schedule)
190
+ - **Business Impact**: Low financial, Medium operational, Medium reputational
191
+ - **Strategic Value**: Democratic transparency, open civic technology leadership
192
+
193
+ **Key Security Controls**:
194
+
195
+ - ✅ **Minimal Attack Surface**: Static site, no databases, no server-side
196
+ execution
197
+ - ✅ **Automated Security**: CodeQL SAST, Dependabot SCA, npm audit
198
+ - ✅ **Supply Chain Security**: SHA-pinned GitHub Actions, SBOM generation
199
+ - ✅ **Input Validation**: Multi-layer XSS prevention, HTML sanitization
200
+ - ✅ **Infrastructure Security**: GitHub-hosted ephemeral runners, HTTPS
201
+ enforcement
202
+ - ✅ **Compliance**: ISO 27001, GDPR, NIS2, EU CRA aligned
203
+
204
+ **Security Metrics**:
205
+
206
+ - Zero known vulnerabilities (npm audit clean)
207
+ - 82%+ code coverage with security tests
208
+ - 100% dependency scanning coverage
209
+ - 0 CodeQL critical/high findings
210
+
211
+ ### ISMS Alignment
212
+
213
+ This project follows
214
+ [Hack23 ISMS Secure Development Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md):
215
+
216
+ - ✅ Security architecture documentation (C4 models with Mermaid)
217
+ - ✅ Threat modeling (STRIDE analysis)
218
+ - ✅ Security testing (SAST, SCA, unit tests)
219
+ - ✅ Compliance mapping (ISO 27001, GDPR, NIS2)
220
+
221
+ ## 🤝 Community & Governance
222
+
223
+ EU Parliament Monitor is an open source project with transparent governance and community standards.
224
+
225
+ ### Open Source Standards
226
+
227
+ - **[Contributing Guide](CONTRIBUTING.md)** - Development workflow, code standards, and contribution guidelines
228
+ - **[Code of Conduct](CODE_OF_CONDUCT.md)** - Community standards based on Contributor Covenant 2.1
229
+ - **[Security Policy](SECURITY.md)** - Vulnerability disclosure and security practices
230
+ - **[Authors & Contributors](AUTHORS.md)** - Recognition of project contributors
231
+ - **[License](LICENSE)** - Apache License 2.0 full text
232
+
233
+ ### Community Channels
234
+
235
+ - **GitHub Issues**: Bug reports and feature requests
236
+ - **GitHub Discussions**: Questions and community discussion
237
+ - **Security**: [security@hack23.com](mailto:security@hack23.com) for vulnerability reports
238
+ - **Conduct**: [conduct@hack23.com](mailto:conduct@hack23.com) for Code of Conduct issues
239
+
240
+ ### Governance Compliance
241
+
242
+ This project adheres to:
243
+ - ✅ **OpenSSF Best Practices**: Following CII Best Practices criteria
244
+ - ✅ **ISMS Compliance**: Aligned with Hack23 ISMS policies
245
+ - ✅ **Transparent Development**: Public repository, open discussions
246
+ - ✅ **Security First**: Comprehensive security disclosure policy
247
+
248
+ ## Code Quality & Testing
249
+
250
+ EU Parliament Monitor maintains high code quality standards with comprehensive
251
+ testing:
252
+
253
+ ### Code Quality
254
+
255
+ - **ESLint**: Comprehensive linting with security, complexity, and documentation
256
+ checks
257
+ - **Prettier**: Consistent code formatting across all JavaScript files
258
+ - **Pre-commit Hooks**: Automatic linting and formatting before every commit
259
+ - **CI/CD Quality Gates**: Automated checks on every pull request
260
+ - **TypeDoc/JSDoc**: Complete documentation for all functions
261
+
262
+ **Code Standards**: See [docs/CODE_STANDARDS.md](docs/CODE_STANDARDS.md) for
263
+ detailed coding guidelines.
264
+
265
+ ### Testing Infrastructure
266
+
267
+ Comprehensive test suite with **Vitest** and **Playwright** covering all
268
+ functionality:
269
+
270
+ #### Unit & Integration Tests (Vitest)
271
+
272
+ - **Unit Tests**: Article generation, MCP client, index/sitemap generation
273
+ - **Integration Tests**: Full workflows, MCP integration, multi-language support
274
+ - **Coverage**: ≥80% line coverage, ≥75% branch coverage
275
+ - **Test Count**: 169+ tests covering critical paths
276
+
277
+ ```bash
278
+ # Run unit & integration tests
279
+ npm test
280
+
281
+ # Run with coverage
282
+ npm run test:coverage
283
+
284
+ # Run tests in watch mode
285
+ npm run test:watch
286
+
287
+ # Run with UI (browser interface)
288
+ npm run test:ui
289
+ ```
290
+
291
+ #### End-to-End Tests (Playwright)
292
+
293
+ - **E2E Tests**: Complete user experience validation
294
+ - **Cross-Browser**: Chromium, Firefox, WebKit
295
+ - **Mobile Support**: Mobile Chrome, Mobile Safari
296
+ - **Accessibility**: WCAG 2.1 AA compliance with axe-core
297
+ - **Responsive Design**: Multiple viewport sizes
298
+ - **Test Count**: 60+ E2E tests covering user journeys
299
+
300
+ ```bash
301
+ # Run E2E tests
302
+ npm run test:e2e
303
+
304
+ # Run with UI (interactive)
305
+ npm run test:e2e:ui
306
+
307
+ # Run in headed mode (see browser)
308
+ npm run test:e2e:headed
309
+
310
+ # View test report
311
+ npm run test:e2e:report
312
+ ```
313
+
314
+ **Testing Documentation**:
315
+
316
+ - [test/README.md](test/README.md) - Unit & integration tests
317
+ - [e2e/README.md](e2e/README.md) - E2E testing guide
318
+
319
+ ## Custom Agents
320
+
321
+ EU Parliament Monitor includes **8 specialized GitHub Copilot custom agents** to
322
+ streamline development:
323
+
324
+ - 🤖 **[product-task-agent](.github/agents/product-task-agent.md)** - Product
325
+ specialist for issue creation and coordination
326
+ - 📰 **[news-journalist](.github/agents/news-journalist.md)** - The
327
+ Economist-style European Parliament reporting
328
+ - 🎨 **[frontend-specialist](.github/agents/frontend-specialist.md)** -
329
+ HTML5/CSS3/WCAG 2.1 AA UI/UX expert
330
+ - 🔄
331
+ **[data-pipeline-specialist](.github/agents/data-pipeline-specialist.md)** -
332
+ European Parliament MCP integration expert
333
+ - ⚙️ **[devops-engineer](.github/agents/devops-engineer.md)** - CI/CD and GitHub
334
+ Actions automation
335
+ - 🔒 **[security-architect](.github/agents/security-architect.md)** - ISMS,
336
+ GDPR, NIS2 compliance expert
337
+ - 📚 **[documentation-architect](.github/agents/documentation-architect.md)** -
338
+ C4 models and architecture docs
339
+ - ✅ **[quality-engineer](.github/agents/quality-engineer.md)** - Testing,
340
+ validation, and accessibility
341
+
342
+ **Usage Example**:
343
+
344
+ ```bash
345
+ # Use product-task-agent to analyze repository and create improvement issues
346
+ @product-task-agent analyze the multi-language support and create issues for any gaps
347
+
348
+ # Use news-journalist to generate content
349
+ @news-journalist create a week-ahead article for the upcoming plenary session
350
+
351
+ # Use frontend-specialist for UI improvements
352
+ @frontend-specialist make the language switcher fully keyboard accessible
353
+ ```
354
+
355
+ **Learn More**: See [Custom Agents Documentation](.github/agents/README.md) for
356
+ detailed agent capabilities, usage patterns, and examples.
357
+
358
+ ## Languages Supported
359
+
360
+ - **Nordic**: English (en), Swedish (sv), Danish (da), Norwegian (no), Finnish (fi)
361
+ - **EU Core**: German (de), French (fr), Spanish (es), Dutch (nl)
362
+ - **Middle East**: Arabic (ar), Hebrew (he)
363
+ - **East Asia**: Japanese (ja), Korean (ko), Chinese (zh)
364
+
365
+ ## Requirements
366
+
367
+ - **Node.js**: Version 25 or higher
368
+ - **npm**: Version 10 or higher (comes with Node.js 25)
369
+ - **Git**: For cloning the repository
370
+
371
+ You can verify your Node.js version with:
372
+ ```bash
373
+ node --version # Should be v25.x.x or higher
374
+ npm --version # Should be 10.x.x or higher
375
+ ```
376
+
377
+ ## Installation
378
+
379
+ ```bash
380
+ # Clone the repository
381
+ git clone https://github.com/Hack23/euparliamentmonitor.git
382
+ cd euparliamentmonitor
383
+
384
+ # Install dependencies
385
+ npm install
386
+ ```
387
+
388
+ ### Optional: European Parliament MCP Server
389
+
390
+ For real EU Parliament data integration, install the MCP server:
391
+
392
+ ```bash
393
+ # Clone the MCP server repository
394
+ git clone https://github.com/Hack23/European-Parliament-MCP-Server.git
395
+ cd European-Parliament-MCP-Server
396
+
397
+ # Install dependencies and build
398
+ npm install
399
+ npm run build
400
+
401
+ # The server will be available at dist/index.js
402
+ # You can install it globally or reference the path
403
+ ```
404
+
405
+ Configure the MCP server path in environment variables:
406
+
407
+ ```bash
408
+ export EP_MCP_SERVER_PATH="/path/to/European-Parliament-MCP-Server/dist/index.js"
409
+ ```
410
+
411
+ **Note**: The MCP server is currently in development. News generation works
412
+ without it using placeholder content.
413
+
414
+ ## Usage
415
+
416
+ ### Generate News Articles
417
+
418
+ ```bash
419
+ # Generate week ahead article in English
420
+ npm run generate-news -- --types=week-ahead --languages=en
421
+
422
+ # Generate multiple article types in multiple languages
423
+ npm run generate-news -- --types=week-ahead,committee-reports --languages=en,de,fr
424
+
425
+ # Generate in all eu-core preset languages
426
+ npm run generate-news -- --types=week-ahead --languages=eu-core
427
+
428
+ # Generate in all supported languages
429
+ npm run generate-news -- --types=week-ahead --languages=all
430
+ ```
431
+
432
+ ### Generate Indexes and Sitemap
433
+
434
+ ```bash
435
+ # Generate language-specific index pages
436
+ npm run generate-news-indexes
437
+
438
+ # Generate sitemap.xml
439
+ npm run generate-sitemap
440
+ ```
441
+
442
+ ### Local Development
443
+
444
+ ```bash
445
+ # Serve the site locally
446
+ npm run serve
447
+
448
+ # Open http://localhost:8080 in your browser
449
+ ```
450
+
451
+ ## Project Structure
452
+
453
+ ```
454
+ euparliamentmonitor/
455
+ ├── .github/
456
+ │ ├── agents/ # Custom GitHub Copilot agents
457
+ │ ├── workflows/ # CI/CD workflow configurations
458
+ │ └── release-drafter.yml # Release notes configuration
459
+ ├── src/ # TypeScript source (compiles to scripts/)
460
+ │ ├── constants/ # Language data, configuration
461
+ │ ├── generators/ # News, index, sitemap generators
462
+ │ ├── mcp/ # European Parliament MCP client
463
+ │ ├── templates/ # HTML article templates
464
+ │ ├── types/ # Shared TypeScript interfaces
465
+ │ └── utils/ # File utilities, metadata
466
+ ├── scripts/ # Compiled JavaScript output
467
+ │ ├── constants/ # Compiled constants
468
+ │ ├── generators/ # Compiled generators
469
+ │ ├── mcp/ # Compiled MCP client
470
+ │ ├── templates/ # Compiled templates
471
+ │ ├── types/ # Compiled type definitions
472
+ │ └── utils/ # Compiled utilities
473
+ ├── news/ # Generated news articles
474
+ │ └── metadata/ # Generation metadata
475
+ ├── test/ # Vitest unit & integration tests
476
+ ├── e2e/ # Playwright E2E tests
477
+ ├── docs/ # Generated documentation
478
+ ├── styles.css # Article styling
479
+ ├── index-{lang}.html # Language-specific index pages
480
+ ├── typedoc.json # TypeDoc configuration
481
+ ├── tsconfig.json # TypeScript configuration
482
+ ├── sitemap.xml # SEO sitemap
483
+ └── package.json # Project dependencies
484
+ ```
485
+
486
+ ## CI/CD & Automation
487
+
488
+ ### GitHub Actions Workflows
489
+
490
+ The repository includes comprehensive GitHub Actions workflows for automation
491
+ and quality assurance:
492
+
493
+ #### 📰 News Generation
494
+
495
+ - **Schedule**: Runs daily at 06:00 UTC
496
+ - **Manual Trigger**: Can be triggered manually with custom parameters
497
+ - **Automatic Commit**: Commits and pushes generated articles automatically
498
+ - **Workflow**: `.github/workflows/news-generation.yml`
499
+
500
+ **Workflow Inputs:**
501
+
502
+ - `article_types`: Comma-separated list of article types (default: `week-ahead`)
503
+ - `languages`: Languages to generate (`en`, `eu-core`, `all`, or custom list)
504
+ - `force_generation`: Force generation even if recent articles exist
505
+
506
+ #### 🏷️ PR Labeling
507
+
508
+ - **Automatic**: Labels PRs based on file changes
509
+ - **Configuration**: `.github/labeler.yml`
510
+ - **Workflow**: `.github/workflows/labeler.yml`
511
+ - **Setup**: Run `.github/workflows/setup-labels.yml` once to create all labels
512
+
513
+ #### 📦 Release Management
514
+
515
+ - **Automated Release Notes**: Via Release Drafter
516
+ - **Semantic Versioning**: Based on PR labels
517
+ - **SBOM & Attestations**: Security compliance with artifact attestations
518
+ - **Workflow**: `.github/workflows/release.yml`
519
+ - **Configuration**: `.github/release-drafter.yml`
520
+
521
+ #### 🔒 Security Scanning
522
+
523
+ - **CodeQL**: Automated security analysis on push, PR, and weekly schedule
524
+ - **OpenSSF Scorecard**: Supply chain security assessment (weekly, on branch protection changes)
525
+ - **Dependabot**: Weekly dependency updates for npm and GitHub Actions
526
+ - **Dependency Review**: Vulnerability scanning on pull requests
527
+ - **Vulnerability Scanning**: Automated npm audit in PR validation
528
+ - **Workflows**: `.github/workflows/codeql.yml`, `.github/workflows/scorecards.yml`, `.github/dependabot.yml`, `.github/workflows/dependency-review.yml`
529
+
530
+ #### 🏆 Compliance & Quality
531
+
532
+ - **REUSE Compliance**: License header verification (FSFE REUSE specification)
533
+ - **SonarCloud Analysis**: Automatic server-side code quality, security vulnerabilities, and technical debt tracking
534
+ - **SLSA Provenance**: Level 3 build attestations with SBOM generation on releases
535
+ - **Workflows**: `.github/workflows/reuse.yml`, `.github/workflows/release.yml`
536
+
537
+ #### ✅ Test & Validation
538
+
539
+ - **HTML Validation**: Automated htmlhint checks
540
+ - **Functional Tests**: News generation, index, and sitemap validation
541
+ - **Security Checks**: npm audit for vulnerabilities
542
+ - **Workflow**: `.github/workflows/test-and-report.yml`
543
+
544
+ **📊 Evidence:** See [Workflow Status Badges](#-status-badges) at top of README.
545
+ ### Workflow Status Badges
546
+
547
+ **Core Workflows:**
548
+
549
+ [![News Generation](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml)
550
+ [![Test and Report](https://github.com/Hack23/euparliamentmonitor/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/test-and-report.yml)
551
+ [![E2E Tests](https://github.com/Hack23/euparliamentmonitor/actions/workflows/e2e.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/e2e.yml)
552
+
553
+ **Security Workflows:**
554
+
555
+ [![CodeQL](https://github.com/Hack23/euparliamentmonitor/actions/workflows/codeql.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/codeql.yml)
556
+ [![OpenSSF Scorecard](https://github.com/Hack23/euparliamentmonitor/actions/workflows/scorecards.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/scorecards.yml)
557
+ [![Dependency Review](https://github.com/Hack23/euparliamentmonitor/actions/workflows/dependency-review.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/dependency-review.yml)
558
+
559
+ **Compliance Workflows:**
560
+
561
+ [![REUSE Compliance](https://github.com/Hack23/euparliamentmonitor/actions/workflows/reuse.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/reuse.yml)
562
+ [![SLSA Provenance](https://github.com/Hack23/euparliamentmonitor/actions/workflows/release.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/release.yml)
563
+
564
+ ### Manual Release Process
565
+
566
+ To create a new release:
567
+
568
+ 1. Go to **Actions** → **Release** workflow
569
+ 2. Click **Run workflow**
570
+ 3. Enter version (e.g., `v1.0.0`)
571
+ 4. Select if pre-release
572
+ 5. The workflow will:
573
+ - Run validation and tests (169 unit tests, E2E tests)
574
+ - Generate API documentation (TypeDoc)
575
+ - Generate test coverage reports (Vitest HTML)
576
+ - Generate E2E test reports (Playwright)
577
+ - Create documentation index
578
+ - Commit documentation to main branch
579
+ - Generate SBOM and attestations (SLSA Level 3)
580
+ - Create GitHub release with artifacts
581
+ - Update release notes automatically
582
+
583
+ **🔒 ISMS Evidence:**
584
+ - [Release Workflow](.github/workflows/release.yml) - Complete automation
585
+ - [SLSA Attestations](https://github.com/Hack23/euparliamentmonitor/attestations) - Build provenance
586
+ - [Release Process Guide](docs/RELEASE_PROCESS.md) - Step-by-step documentation
587
+
588
+ ### Documentation as Code
589
+
590
+ Every release automatically generates comprehensive documentation:
591
+
592
+ | Documentation | Description | Link |
593
+ |--------------|-------------|------|
594
+ | **API Documentation** | TypeDoc-generated API reference from TypeScript source | [View Docs](https://hack23.github.io/euparliamentmonitor/docs/api/) |
595
+ | **Test Coverage** | Interactive Vitest coverage reports (82%+) | [View Coverage](https://hack23.github.io/euparliamentmonitor/docs/coverage/) |
596
+ | **E2E Test Reports** | Playwright test results with screenshots | [View Report](https://hack23.github.io/euparliamentmonitor/playwright-report/) |
597
+ | **Documentation Index** | Beautiful hub linking all reports | [View Index](https://hack23.github.io/euparliamentmonitor/docs/) |
598
+
599
+ **📋 How It Works:**
600
+ 1. Release workflow runs all tests
601
+ 2. Generates API docs with TypeDoc
602
+ 3. Copies coverage reports to `docs/`
603
+ 4. Creates documentation index page
604
+ 5. Commits everything to `main` branch
605
+ 6. Documentation is version-controlled and traceable
606
+
607
+ **🎯 Run Locally:**
608
+ ```bash
609
+ npm run docs:generate # Generate all documentation
610
+ npm run docs:api # Generate API docs only
611
+ npm run docs:index # Generate index page
612
+ ```
613
+
614
+ **🔒 ISMS Compliance:**
615
+ - Documentation-as-code follows [Hack23 ISMS Secure Development Policy §3.2](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md#32-architecture-documentation)
616
+ - All releases include complete documentation evidence
617
+ - Documentation committed to repository for full auditability
618
+
619
+ ### Setting Up Labels
620
+
621
+ First-time setup requires running the label creation workflow:
622
+
623
+ 1. Go to **Actions** → **Setup Repository Labels**
624
+ 2. Click **Run workflow**
625
+ 3. Wait for completion
626
+ 4. Labels will be automatically applied to future PRs
627
+
628
+ ## Configuration
629
+
630
+ ### Language Presets
631
+
632
+ - `en` - English only
633
+ - `eu-core` - English, German, French, Spanish, Dutch
634
+ - `nordic` - English, Swedish, Danish, Norwegian, Finnish
635
+ - `all` - All 14 supported languages
636
+
637
+ ### Article Types
638
+
639
+ - `week-ahead` - Preview of upcoming parliamentary events
640
+ - `committee-reports` - Committee activity analysis (coming soon)
641
+ - `propositions` - Legislative proposals analysis (coming soon)
642
+ - `motions` - Parliamentary motions analysis (coming soon)
643
+ - `breaking` - Breaking news coverage (coming soon)
644
+
645
+ ## Contributing
646
+
647
+ We welcome contributions from developers, journalists, translators, and security researchers!
648
+
649
+ ### How to Contribute
650
+
651
+ Please read our comprehensive [Contributing Guide](CONTRIBUTING.md) for:
652
+ - Development workflow and setup instructions
653
+ - Code quality requirements and testing standards
654
+ - Pull request process and review guidelines
655
+ - Security best practices and ISMS compliance
656
+ - Multi-language contribution guidelines
657
+
658
+ ### Code of Conduct
659
+
660
+ This project adheres to the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [conduct@hack23.com](mailto:conduct@hack23.com).
661
+
662
+ ### Security
663
+
664
+ If you discover a security vulnerability, please follow our [Security Policy](SECURITY.md) for responsible disclosure. **Do not** report security issues through public GitHub issues.
665
+
666
+ ### Contributors
667
+
668
+ See [AUTHORS.md](AUTHORS.md) for a list of contributors who have helped make this project possible.
669
+ Contributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines on:
670
+
671
+ - Code quality requirements (ESLint, Prettier, JSDoc)
672
+ - Testing requirements (80% line coverage, 75% branch coverage)
673
+ - Security requirements (input validation, XSS prevention, dependency scanning)
674
+ - Commit message format (conventional commits)
675
+ - Pull request process
676
+
677
+ **Security-Critical Contributions**: All security-related changes must align with [SECURITY_ARCHITECTURE.md](SECURITY_ARCHITECTURE.md) and [Hack23 ISMS Secure Development Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md).
678
+
679
+ ## Security Policy
680
+
681
+ For security vulnerability reporting and disclosure process, please see [SECURITY.md](SECURITY.md).
682
+
683
+ **Responsible Disclosure**:
684
+ - Report vulnerabilities privately via GitHub Security Advisories
685
+ - 48-hour acknowledgment, 7-day validation, 30-day remediation for critical issues
686
+ - Public recognition for security researchers (unless anonymity requested)
687
+
688
+ ## Badge Maintenance
689
+
690
+ ### Maintaining Security Badge Status
691
+
692
+ EU Parliament Monitor maintains security excellence through continuous compliance with OpenSSF best practices:
693
+
694
+ #### OpenSSF Scorecard (Target: ≥7.0)
695
+
696
+ **Current Optimizations**:
697
+ - ✅ Branch protection on `main` branch
698
+ - ✅ Required code review for pull requests
699
+ - ✅ SHA-pinned GitHub Actions
700
+ - ✅ CodeQL SAST enabled
701
+ - ✅ Dependabot alerts enabled
702
+ - ✅ SECURITY.md present
703
+ - ✅ No dangerous workflow patterns
704
+
705
+ **Monitoring**: View current score at [OpenSSF Scorecard Dashboard](https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor)
706
+
707
+ #### CII Best Practices (Target: Passing → Silver → Gold)
708
+
709
+ **Requirements Met**:
710
+ - ✅ Public version control (GitHub)
711
+ - ✅ Public issue tracker (GitHub Issues)
712
+ - ✅ LICENSE file (Apache-2.0)
713
+ - ✅ CONTRIBUTING.md with clear guidelines
714
+ - ✅ CODE_OF_CONDUCT.md
715
+ - ✅ SECURITY.md with vulnerability reporting
716
+ - ✅ Documentation in README
717
+ - ✅ Automated testing (Vitest + Playwright, ≥80% coverage)
718
+ - ✅ Static analysis (CodeQL, ESLint)
719
+ - ✅ Dependency scanning (Dependabot, npm audit)
720
+
721
+ **Registration**: Complete questionnaire at [CII Best Practices](https://bestpractices.coreinfrastructure.org/)
722
+
723
+ #### SLSA Level 3 (Status: ✅ Implemented)
724
+
725
+ **Provenance Generation**:
726
+ - ✅ Automated on releases via `.github/workflows/release.yml`
727
+ - ✅ Build attestations using `actions/attest-build-provenance@v2`
728
+ - ✅ SBOM generation using SPDX format
729
+ - ✅ Artifacts uploaded to GitHub Releases
730
+
731
+ **Verification**: View attestations at `https://github.com/Hack23/euparliamentmonitor/attestations/`
732
+
733
+ #### FOSSA License Compliance
734
+
735
+ **Setup Required**:
736
+ 1. Sign up at [FOSSA](https://fossa.com/)
737
+ 2. Connect GitHub repository
738
+ 3. Configure license policy (Apache-2.0 compatible only)
739
+
740
+ **Badge**: Updates automatically after scan completion
741
+
742
+ #### REUSE Compliance (Status: ✅ Implemented)
743
+
744
+ **Compliance Verification**:
745
+ - ✅ `.reuse/dep5` covers all files without headers
746
+ - ✅ Apache-2.0 license applied to all project files
747
+ - ✅ Copyright notices: "2024-2026 Hack23 AB"
748
+
749
+ **Workflow**: Runs on push, pull requests, and weekly via `.github/workflows/reuse.yml`
750
+
751
+ ### ISMS Policy References
752
+
753
+ This project adheres to [Hack23 ISMS](https://github.com/Hack23/ISMS-PUBLIC) policies:
754
+
755
+ | Policy | Relevance | Implementation |
756
+ |--------|-----------|----------------|
757
+ | [**Open Source Policy**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Open_Source_Policy.md) | Security badge requirements, governance artifacts | All badges, docs, REUSE compliance |
758
+ | [**CRA Conformity Assessment Process**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CRA_Conformity_Assessment_Process.md) | EU Cyber Resilience Act compliance | [CRA-ASSESSMENT.md](CRA-ASSESSMENT.md) |
759
+ | [**Secure Development Policy**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md) | Development security standards | SECURITY_ARCHITECTURE.md, SAST/SCA/DAST |
760
+ | [**Threat Modeling Policy**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Threat_Modeling.md) | Threat analysis requirements | STRIDE analysis in THREAT_MODEL.md |
761
+ | [**Vulnerability Management**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Vulnerability_Management.md) | Remediation SLAs | SECURITY.md disclosure timeline |
762
+ | [**Classification Framework**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) | Data classification | Public/Medium/Medium (L1/L2/L2) |
763
+ | [**Incident Response Plan**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Incident_Response_Plan.md) | Security incident procedures | Linked in SECURITY.md |
764
+
765
+ ### Compliance Frameworks
766
+
767
+ EU Parliament Monitor aligns with multiple compliance frameworks:
768
+
769
+ | Framework | Controls | Evidence |
770
+ |-----------|----------|----------|
771
+ | **ISO 27001** | A.12.6.1 (Vulnerability Management), A.14.2.8 (Security Testing) | CodeQL, Dependabot, npm audit |
772
+ | **NIST CSF 2.0** | Identify, Protect, Detect, Respond, Recover | SECURITY_ARCHITECTURE.md compliance matrix |
773
+ | **CIS Controls v8.1** | 18.3 (Remediate Vulnerabilities), 2.7 (Allowlisting) | Automated scanning, SBOM |
774
+ | **GDPR** | Data Protection by Design | European Parliament open data (public) |
775
+ | **NIS2** | Article 20, 21 (Cybersecurity Risk Management) | Threat model, security controls |
776
+ | **EU Cyber Resilience Act** | SBOM, Vulnerability Disclosure, Annex I/V | [CRA-ASSESSMENT.md](CRA-ASSESSMENT.md), SLSA provenance, SECURITY.md |
777
+
778
+ ## 🤖 AI-Disrupted News Generation & Agentic Intelligence
779
+
780
+ > *"While traditional newsrooms debate whether AI will replace journalists,
781
+ > EU Parliament Monitor quietly deployed 8 autonomous AI agents that generate
782
+ > investigative political intelligence in 14 languages before most reporters
783
+ > have finished their morning coffee. The future of parliamentary journalism
784
+ > didn't send a memo — it opened a pull request."*
785
+
786
+ The EU Parliament Monitor doesn't just report on European Parliament activity — it **autonomously generates deep political intelligence** at machine speed, with editorial quality that would make legacy news desks nervous. Every article is researched, written, localized, and prepared for publication by AI agents that operate by default on live European Parliament data via the [MCP Server](https://github.com/Hack23/European-Parliament-MCP-Server) (46 tools, real-time data), with transparent fallback to placeholder/test data when live access is unavailable as described above. The agents automatically generate content and open publication-ready pull requests; publication to the site occurs when a human reviews and merges those PRs.
787
+
788
+ ### 📰 Agentic News Generation Architecture
789
+
790
+ **8 autonomous news workflows** run on precision schedules, each powered by a dedicated GitHub Copilot agentic workflow that fetches live EP data (with documented fallback behavior), generates Economist-style analysis, and opens publication-ready pull requests across all 14 languages:
791
+
792
+ ```mermaid
793
+ graph LR
794
+ subgraph "📅 Daily Cycle (Mon-Fri)"
795
+ CR["🏛️ Committee Reports<br/>04:00 UTC"]
796
+ PR["📜 Propositions<br/>05:00 UTC"]
797
+ MO["⚖️ Motions<br/>06:00 UTC"]
798
+ end
799
+
800
+ subgraph "📆 Weekly Cycle"
801
+ WA["📋 Week Ahead<br/>Fri 07:00 UTC"]
802
+ WR["📊 Weekly Review<br/>Sat 09:00 UTC"]
803
+ end
804
+
805
+ subgraph "📅 Monthly Cycle"
806
+ MA["🔭 Month Ahead<br/>1st 08:00 UTC"]
807
+ MR["📈 Monthly Review<br/>28th 10:00 UTC"]
808
+ end
809
+
810
+ subgraph "🎛️ On-Demand"
811
+ AG["🚀 Article Generator<br/>Manual Dispatch"]
812
+ end
813
+
814
+ MCP["🔌 EP MCP Server<br/>46 Tools · Live Data"]
815
+
816
+ MCP --> CR & PR & MO & WA & WR & MA & MR & AG
817
+
818
+ style CR fill:#1a5276,color:#fff
819
+ style PR fill:#1a5276,color:#fff
820
+ style MO fill:#1a5276,color:#fff
821
+ style WA fill:#117a65,color:#fff
822
+ style WR fill:#117a65,color:#fff
823
+ style MA fill:#7d3c98,color:#fff
824
+ style MR fill:#7d3c98,color:#fff
825
+ style AG fill:#b9770e,color:#fff
826
+ style MCP fill:#c0392b,color:#fff
827
+ ```
828
+
829
+ | Workflow | Schedule | Focus | Output |
830
+ |----------|----------|-------|--------|
831
+ | 🏛️ **Committee Reports** | Mon–Fri 04:00 UTC | Committee decisions & activities | 14 language articles |
832
+ | 📜 **Propositions** | Mon–Fri 05:00 UTC | Legislative proposals analysis | 14 language articles |
833
+ | ⚖️ **Motions** | Mon–Fri 06:00 UTC | Motions & resolutions analysis | 14 language articles |
834
+ | 📋 **Week Ahead** | Fridays 07:00 UTC | Upcoming parliamentary preview | 14 language articles |
835
+ | 📊 **Weekly Review** | Saturdays 09:00 UTC | Past week retrospective | 14 language articles |
836
+ | 🔭 **Month Ahead** | 1st of month 08:00 UTC | Strategic monthly outlook | 14 language articles |
837
+ | 📈 **Monthly Review** | 28th of month 10:00 UTC | Monthly retrospective analysis | 14 language articles |
838
+ | 🚀 **Article Generator** | Manual dispatch | Multi-type article generation | Configurable |
839
+
840
+ ### 🧠 The Intelligence Stack
841
+
842
+ The platform combines **8 core news-pipeline AI agents** (from a catalog of 22+ specialized agents), **39+ TypeScript source modules**, **21 CI/CD workflows**, and **46 MCP data tools** into a fully autonomous political intelligence pipeline:
843
+
844
+ ```mermaid
845
+ graph TB
846
+ subgraph "🤖 8 Core News Pipeline Agents"
847
+ A1["📰 News Journalist<br/><i>Economist-style reporting</i>"]
848
+ A2["🔄 Data Pipeline<br/><i>MCP integration</i>"]
849
+ A3["🎨 Frontend<br/><i>WCAG 2.1 AA</i>"]
850
+ A4["✅ Quality Engineer<br/><i>Testing & validation</i>"]
851
+ A5["🔒 Security Architect<br/><i>ISMS compliance</i>"]
852
+ A6["📚 Documentation<br/><i>C4 & architecture</i>"]
853
+ A7["⚙️ DevOps Engineer<br/><i>CI/CD automation</i>"]
854
+ A8["📋 Product Task<br/><i>Issue management</i>"]
855
+ end
856
+
857
+ subgraph "⚙️ 21 CI/CD Workflows"
858
+ W1["8 News Generation"]
859
+ W2["5 Security & Compliance"]
860
+ W3["2 Testing"]
861
+ W4["2 Release & Deploy"]
862
+ W5["4 Automation & Infra"]
863
+ end
864
+
865
+ subgraph "📊 Data Layer"
866
+ MCP["🔌 EP MCP Server<br/>46 Tools"]
867
+ TS["📦 39+ TypeScript Modules"]
868
+ L14["🌍 14 Languages"]
869
+ end
870
+
871
+ A1 --> W1
872
+ A2 --> MCP
873
+ A7 --> W2 & W3 & W4
874
+ W1 --> TS --> L14
875
+
876
+ style A1 fill:#2e86c1,color:#fff
877
+ style A2 fill:#2e86c1,color:#fff
878
+ style A3 fill:#2e86c1,color:#fff
879
+ style A4 fill:#2e86c1,color:#fff
880
+ style A5 fill:#2e86c1,color:#fff
881
+ style A6 fill:#2e86c1,color:#fff
882
+ style A7 fill:#2e86c1,color:#fff
883
+ style A8 fill:#2e86c1,color:#fff
884
+ style W1 fill:#1a5276,color:#fff
885
+ style W2 fill:#7d3c98,color:#fff
886
+ style W3 fill:#117a65,color:#fff
887
+ style W4 fill:#b9770e,color:#fff
888
+ style MCP fill:#c0392b,color:#fff
889
+ style TS fill:#1c2833,color:#fff
890
+ style L14 fill:#117a65,color:#fff
891
+ ```
892
+
893
+ ### 🚀 Future Advance: AI Evolution Roadmap (2026–2037)
894
+
895
+ > *"We're not just keeping up with AI — we're building the editorial infrastructure
896
+ > for the era when machines understand parliamentary procedure better than most MEPs."*
897
+
898
+ The platform evolves through six phases from agentic news generation to AGI-enhanced transformative democracy. Full details in **[Future Mindmap](FUTURE_MINDMAP.md)** and **[Future Workflows](FUTURE_WORKFLOWS.md)**.
899
+
900
+ ```mermaid
901
+ timeline
902
+ title EU Parliament Monitor — AI Evolution Roadmap
903
+ section Phase 1 (2026)
904
+ Agentic News : 8 autonomous workflows
905
+ : 14-language generation
906
+ : MCP data integration
907
+ : Economist-style analysis
908
+ section Phase 2 (2027)
909
+ Predictive Analytics : Voting outcome prediction
910
+ : Legislative impact forecasting
911
+ : Cross-party coalition detection
912
+ : Automated trend analysis
913
+ section Phase 3 (2028–2029)
914
+ Multi-Modal Intelligence : Video plenary analysis
915
+ : Real-time debate tracking
916
+ : Infographic auto-generation
917
+ : Autonomous content pipelines
918
+ section Phase 4 (2030–2031)
919
+ Near-Expert Analysis : 50+ parliament coverage
920
+ : Expert-level policy briefs
921
+ : Predictive governance models
922
+ : Universal language support
923
+ section Phase 5 (2032–2033)
924
+ Global Coverage : 100+ parliaments
925
+ : Pre-AGI capabilities
926
+ : Real-time policy impact
927
+ : Cross-jurisdiction analysis
928
+ section Phase 6 (2034–2037)
929
+ AGI Era : Transformative democracy
930
+ : 195 national legislatures
931
+ : Policy prediction before proposal
932
+ : Human oversight maintained
933
+ ```
934
+
935
+ ### 🤖 Phase 6: AGI Era & Transformative Democracy (2034–2037)
936
+
937
+ When AGI or near-AGI systems become available, the platform architecture is designed to scale responsibly:
938
+
939
+ | Capability | Description |
940
+ |-----------|-------------|
941
+ | 🤖 **Autonomous Analysis** | AGI-powered real-time political intelligence across all 195 national legislatures |
942
+ | 🌐 **Universal Language Support** | Every UN language supported natively — no translation pipeline, native generation |
943
+ | 📊 **Predictive Governance** | Policy impact prediction *before* legislation is proposed — anticipatory intelligence |
944
+ | ⚖️ **Ethical AI Governance** | Human oversight maintained regardless of AI capability level — democratic safeguards hardcoded |
945
+ | 🛡️ **Democratic Safeguards** | Platform architecture prevents weaponization or manipulation — transparency by design |
946
+
947
+ ### 📈 AI Model Evolution Strategy
948
+
949
+ **Assumptions:** Major AI model upgrades annually, competitors (OpenAI, Google, Meta, EU sovereign AI) evaluated at each release. Architecture accommodates potential paradigm shifts (quantum AI, neuromorphic computing).
950
+
951
+ Projected workflow counts below include all CI/CD workflow definitions, agentic workflow sources, and planned variants across the platform. The 2026 baseline (~44) builds on the current 21 deployed `.yml` workflows + 8 agentic `.md` sources (29 today) plus planned security, localization, and data-pipeline additions.
952
+
953
+ | Year | Projected Workflow Definitions | AI Model | Key Capability |
954
+ |------|-------------------------------|----------|----------------|
955
+ | **2026** | 44–50 | Opus 4.6–4.9 | 🟢 Agentic news generation |
956
+ | **2027** | 50–55 | Opus 5.x | 🔵 Predictive analytics |
957
+ | **2028** | 55–65 | Opus 6.x | 🟣 Multi-modal content |
958
+ | **2029** | 65–75 | Opus 7.x | 🟠 Autonomous pipeline |
959
+ | **2030** | 75–85 | Opus 8.x | 🔴 Near-expert analysis |
960
+ | **2031–2033** | 85–100 | Opus 9–10.x / Pre-AGI | ⚪ Global coverage |
961
+ | **2034–2037** | 100–120+ | AGI / Post-AGI | ⭐ Transformative platform |
962
+
963
+ ```mermaid
964
+ %%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#1a5276', 'primaryTextColor': '#fff', 'lineColor': '#2e86c1', 'secondaryColor': '#117a65'}}}%%
965
+ xychart-beta
966
+ title "Projected Workflow Definitions & Variants (2026–2037)"
967
+ x-axis ["2026", "2027", "2028", "2029", "2030", "2031", "2032", "2033", "2034", "2035", "2036", "2037"]
968
+ y-axis "Workflow definitions & variants" 0 --> 130
969
+ bar [44, 53, 60, 70, 80, 88, 94, 100, 105, 110, 115, 120]
970
+ line [44, 53, 60, 70, 80, 88, 94, 100, 105, 110, 115, 120]
971
+ ```
972
+
973
+ ### 📚 Detailed Roadmap Documentation
974
+
975
+ | Document | Focus | Coverage |
976
+ |----------|-------|----------|
977
+ | 📘 **[Future Mindmap](FUTURE_MINDMAP.md)** | Capability evolution & system vision | 2026–2037 AI/ML roadmap, multi-parliament expansion, API ecosystem |
978
+ | 📗 **[Future Workflows](FUTURE_WORKFLOWS.md)** | CI/CD evolution & automation roadmap | Security hardening, performance optimization, AGI-ready pipelines |
979
+
980
+ ## License
981
+
982
+ Copyright 2024-2026 Hack23 AB
983
+
984
+ Licensed under the Apache License, Version 2.0 (the "License");
985
+ you may not use this file except in compliance with the License.
986
+ You may obtain a copy of the License at
987
+
988
+ http://www.apache.org/licenses/LICENSE-2.0
989
+
990
+ Unless required by applicable law or agreed to in writing, software
991
+ distributed under the License is distributed on an "AS IS" BASIS,
992
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
993
+ See the License for the specific language governing permissions and
994
+ limitations under the License.
995
+
996
+ See [LICENSE](LICENSE) file for full details.
997
+
998
+ ## Credits
999
+
1000
+ This project is based on the news generation implementation from
1001
+ [Hack23/riksdagsmonitor](https://github.com/Hack23/riksdagsmonitor).
1002
+
1003
+ ## Author
1004
+
1005
+ Hack23 AB - Intelligence Operations Team