{"id":44927565,"url":"https://github.com/hack23/euparliamentmonitor","last_synced_at":"2026-04-25T13:23:17.661Z","repository":{"id":338791443,"uuid":"1159184290","full_name":"Hack23/euparliamentmonitor","owner":"Hack23","description":"European Parliament Intelligence Platform - Monitor political activity with systematic transparency","archived":false,"fork":false,"pushed_at":"2026-04-11T02:29:28.000Z","size":102797,"stargazers_count":4,"open_issues_count":0,"forks_count":5,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-11T04:29:53.964Z","etag":null,"topics":["agentic-workflow","ai","eu-parlament","european-union","news","osint","politics"],"latest_commit_sha":null,"homepage":"https://euparliamentmonitor.com/","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Hack23.png","metadata":{"files":{"readme":"README.md","changelog":"news/2026-02-24-propositions-ar.html","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":"THREAT_MODEL.md","audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["Hack23"]}},"created_at":"2026-02-16T12:25:06.000Z","updated_at":"2026-04-11T02:29:30.000Z","dependencies_parsed_at":"2026-02-23T03:02:26.641Z","dependency_job_id":null,"html_url":"https://github.com/Hack23/euparliamentmonitor","commit_stats":null,"previous_names":["hack23/euparliamentmonitor"],"tags_count":70,"template":false,"template_full_name":null,"purl":"pkg:github/Hack23/euparliamentmonitor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hack23%2Feuparliamentmonitor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hack23%2Feuparliamentmonitor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hack23%2Feuparliamentmonitor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hack23%2Feuparliamentmonitor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Hack23","download_url":"https://codeload.github.com/Hack23/euparliamentmonitor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hack23%2Feuparliamentmonitor/sbom","scorecard":{"id":1243539,"data":{"date":"2026-02-18T05:55:57Z","repo":{"name":"github.com/Hack23/euparliamentmonitor","commit":"710874480cabe4b65f94be00aeadb84baf73fc49"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":5.6,"checks":[{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Maintained","score":0,"reason":"project was created within the last 90 days. Please review its contents carefully","details":["Warn: Repository was created within the last 90 days."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/1 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:40","Info: jobLevel 'packages' permission set to 'read': .github/workflows/codeql.yml:36","Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql.yml:39","Info: jobLevel 'deployments' permission set to 'read': .github/workflows/copilot-setup-steps.yml:31","Info: jobLevel 'security-events' permission set to 'read': .github/workflows/copilot-setup-steps.yml:37","Info: jobLevel 'contents' permission set to 'read': .github/workflows/copilot-setup-steps.yml:27","Info: jobLevel 'models' permission set to 'read': .github/workflows/copilot-setup-steps.yml:33","Info: jobLevel 'discussions' permission set to 'read': .github/workflows/copilot-setup-steps.yml:34","Info: jobLevel 'pages' permission set to 'read': .github/workflows/copilot-setup-steps.yml:35","Info: jobLevel 'statuses' permission set to 'read': .github/workflows/copilot-setup-steps.yml:38","Info: jobLevel 'actions' permission set to 'read': .github/workflows/copilot-setup-steps.yml:28","Info: jobLevel 'attestations' permission set to 'read': .github/workflows/copilot-setup-steps.yml:29","Info: jobLevel 'checks' permission set to 'read': .github/workflows/copilot-setup-steps.yml:30","Info: jobLevel 'contents' permission set to 'read': .github/workflows/e2e.yml:17","Info: jobLevel 'issues' permission set to 'read': .github/workflows/labeler.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/labeler.yml:16","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yml:27","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:160","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yml:273","Info: jobLevel 'checks' permission set to 'read': .github/workflows/scorecards.yml:35","Info: jobLevel 'contents' permission set to 'read': .github/workflows/scorecards.yml:29","Info: jobLevel 'actions' permission set to 'read': .github/workflows/scorecards.yml:30","Info: jobLevel 'issues' permission set to 'read': .github/workflows/scorecards.yml:32","Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/scorecards.yml:33","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/slsa-provenance.yml:20","Info: jobLevel 'contents' permission set to 'read': .github/workflows/sonarcloud.yml:19","Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/sonarcloud.yml:20","Info: jobLevel 'contents' permission set to 'read': .github/workflows/test-and-report.yml:316","Info: jobLevel 'contents' permission set to 'read': .github/workflows/test-and-report.yml:17","Info: jobLevel 'contents' permission set to 'read': .github/workflows/test-and-report.yml:49","Info: jobLevel 'contents' permission set to 'read': .github/workflows/test-and-report.yml:129","Info: jobLevel 'contents' permission set to 'read': .github/workflows/test-and-report.yml:245","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/test-and-report.yml:246","Warn: no topLevel permission defined: .github/workflows/codeql.yml:1","Warn: no topLevel permission defined: .github/workflows/copilot-setup-steps.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/dependency-review.yml:13","Info: topLevel 'contents' permission set to 'read': .github/workflows/deploy-s3.yml:6","Warn: topLevel 'actions' permission set to 'write': .github/workflows/deploy-s3.yml:8","Warn: no topLevel permission defined: .github/workflows/e2e.yml:1","Info: topLevel permissions set to 'read-all': .github/workflows/labeler.yml:8","Warn: topLevel 'contents' permission set to 'write': .github/workflows/news-generation.yml:24","Info: topLevel permissions set to 'read-all': .github/workflows/release.yml:19","Info: topLevel 'contents' permission set to 'read': .github/workflows/reuse.yml:12","Info: topLevel permissions set to 'read-all': .github/workflows/scorecards.yml:18","Info: topLevel 'contents' permission set to 'read': .github/workflows/setup-labels.yml:13","Info: topLevel permissions set to 'read-all': .github/workflows/slsa-provenance.yml:13","Info: topLevel 'contents' permission set to 'read': .github/workflows/sonarcloud.yml:12","Info: topLevel permissions set to 'read-all': .github/workflows/test-and-report.yml:10"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":8,"reason":"dependency not pinned by hash detected -- score normalized to 8","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/e2e.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/Hack23/euparliamentmonitor/e2e.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/e2e.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/Hack23/euparliamentmonitor/e2e.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/e2e.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/Hack23/euparliamentmonitor/e2e.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/e2e.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/Hack23/euparliamentmonitor/e2e.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/e2e.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/Hack23/euparliamentmonitor/e2e.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/e2e.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/Hack23/euparliamentmonitor/e2e.yml/main?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/copilot-setup-steps.yml:123","Warn: npmCommand not pinned by hash: .github/workflows/copilot-setup-steps.yml:124","Warn: npmCommand not pinned by hash: .github/workflows/copilot-setup-steps.yml:125","Warn: npmCommand not pinned by hash: .github/workflows/copilot-setup-steps.yml:128","Warn: npmCommand not pinned by hash: .github/workflows/slsa-provenance.yml:97","Info:  56 out of  62 GitHub-owned GitHubAction dependencies pinned","Info:  27 out of  27 third-party GitHubAction dependencies pinned","Info:  10 out of  15 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-2g4f-4pwh-qvx6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: SAST configuration detected: CodeQL","Info: all commits (29) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Contributors","score":6,"reason":"project has 2 contributing companies or organizations -- score normalized to 6","details":["Info: found contributions from: Hack23, hack23"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}},{"name":"CI-Tests","score":10,"reason":"8 out of 8 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}}]},"last_synced_at":"2026-02-18T08:55:35.084Z","repository_id":338791443,"created_at":"2026-02-18T08:55:35.084Z","updated_at":"2026-02-18T08:55:35.084Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31911846,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T18:22:33.417Z","status":"online","status_checked_at":"2026-04-17T02:00:06.879Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agentic-workflow","ai","eu-parlament","european-union","news","osint","politics"],"created_at":"2026-02-18T05:12:48.784Z","updated_at":"2026-04-17T02:02:08.726Z","avatar_url":"https://github.com/Hack23.png","language":"HTML","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://hack23.com/icon-192.png\" alt=\"Hack23 Logo\" width=\"192\" height=\"192\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003e🏛️ EU Parliament Monitor\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eEuropean Parliament Intelligence Platform\u003c/strong\u003e\u003cbr\u003e\n  \u003cem\u003eMonitor political activity with systematic transparency\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#\"\u003e\u003cimg src=\"https://img.shields.io/badge/Owner-CEO-0A66C2?style=for-the-badge\" alt=\"Owner\"/\u003e\u003c/a\u003e\n  \u003ca href=\"#\"\u003e\u003cimg src=\"https://img.shields.io/badge/Version-1.0-555?style=for-the-badge\" alt=\"Version\"/\u003e\u003c/a\u003e\n  \u003ca href=\"#\"\u003e\u003cimg src=\"https://img.shields.io/badge/Classification-Public-success?style=for-the-badge\" alt=\"Classification\"/\u003e\u003c/a\u003e\n  \u003ca href=\"#\"\u003e\u003cimg src=\"https://img.shields.io/badge/Review-Annual-orange?style=for-the-badge\" alt=\"Review Cycle\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"120\" align=\"center\"\u003e\n      \u003cimg src=\"https://img.shields.io/badge/EU-Parliament-003399?style=for-the-badge\u0026logo=european-union\u0026logoColor=FFCC00\" width=\"80\" alt=\"EU Parliament Monitor\"/\u003e\n      \u003cdiv\u003e\n        \u003ca href=\"https://github.com/Hack23/euparliamentmonitor\"\u003e\n          \u003cimg src=\"https://img.shields.io/github/v/release/Hack23/euparliamentmonitor\" alt=\"Release\"\u003e\n        \u003c/a\u003e\n      \u003c/div\u003e\n      \u003cdiv\u003e\n        \u003ca href=\"https://www.npmjs.com/package/euparliamentmonitor\"\u003e\n          \u003cimg src=\"https://img.shields.io/npm/v/euparliamentmonitor.svg\" alt=\"npm version\"\u003e\n        \u003c/a\u003e\n      \u003c/div\u003e      \n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003cp\u003e\u003cstrong\u003eEuropean Parliament Intelligence Platform\u003c/strong\u003e — an automated multi-language news platform that monitors EU Parliament activities with 14-language support, covering plenary sessions, committee reports, propositions, and breaking news.\u003c/p\u003e\n      \u003cdiv\u003e\n        \u003ca href=\"https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor\"\u003e\n          \u003cimg src=\"https://api.securityscorecards.dev/projects/github.com/Hack23/euparliamentmonitor/badge\" alt=\"OpenSSF Scorecard\"\u003e\n        \u003c/a\u003e\n        \u003ca href=\"https://www.bestpractices.dev/projects/12068\"\u003e\n          \u003cimg src=\"https://www.bestpractices.dev/projects/12068/badge\" alt=\"OpenSSF Best Practices\"\u003e\n        \u003c/a\u003e\n        \u003ca href=\"https://github.com/Hack23/euparliamentmonitor/attestations\"\u003e\n          \u003cimg src=\"https://slsa.dev/images/gh-badge-level3.svg\" alt=\"SLSA 3\"\u003e\n        \u003c/a\u003e\n        \u003ca href=\"https://github.com/Hack23/euparliamentmonitor/license\"\u003e\n          \u003cimg src=\"https://img.shields.io/github/license/Hack23/euparliamentmonitor\" alt=\"License\"\u003e\n        \u003c/a\u003e\n      \u003c/div\u003e\n      \u003cdiv\u003e\n        \u003ca href=\"https://github.com/Hack23/euparliamentmonitor\"\u003e\u003cstrong\u003e📂 Repository\u003c/strong\u003e\u003c/a\u003e •\n        \u003ca href=\"https://hack23.com/euparliamentmonitor-features.html\"\u003e\u003cstrong\u003e✨ Features\u003c/strong\u003e\u003c/a\u003e •\n        \u003ca href=\"https://hack23.com/euparliamentmonitor-docs.html\"\u003e\u003cstrong\u003e📚 Documentation\u003c/strong\u003e\u003c/a\u003e\n      \u003c/div\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/Hack23/euparliamentmonitor/badge)](https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor)\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/12068/badge)](https://www.bestpractices.dev/projects/12068)\n[![SLSA 3](https://slsa.dev/images/gh-badge-level3.svg)](https://github.com/Hack23/euparliamentmonitor/attestations)\n[![News Generation](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml)\n[![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)\n[![License](https://img.shields.io/github/license/Hack23/euparliamentmonitor)](https://github.com/Hack23/euparliamentmonitor/blob/main/LICENSE)\n[![ISMS](https://img.shields.io/badge/Hack23-ISMS-blue)](https://github.com/Hack23/ISMS-PUBLIC)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/Hack23/euparliamentmonitor)\n\n## 📦 Quick Start\n\n```bash\nnpm install euparliamentmonitor\n```\n\n```typescript\nimport {\n  EuropeanParliamentMCPClient,\n  generateArticleHTML,\n  scoreArticleQuality,\n  ALL_LANGUAGES,\n} from 'euparliamentmonitor';\n```\n\n**Key capabilities:**\n- 🏛️ **EU Parliament MCP Client** — Connect to European Parliament open data via Model Context Protocol\n- 📰 **News Generation** — Generate multi-language articles (14 languages) from parliamentary data\n- 🔍 **Political Intelligence** — Voting anomaly detection, coalition analysis, threat assessment\n- 📊 **Article Quality** — Score and validate generated content with comprehensive quality metrics\n- 🌍 **Multilingual** — Full i18n support: EN, SV, DA, NO, FI, DE, FR, ES, NL, AR, HE, JA, KO, ZH\n\n\u003e Published with [npm provenance](https://docs.npmjs.com/generating-provenance-statements) for supply chain security. [SLSA Level 3](https://github.com/Hack23/euparliamentmonitor/attestations) build attestations included.\n\n## 🎯 Status Badges\n\n### Workflow Status\n[![News Generation](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml)\n[![CodeQL](https://github.com/Hack23/euparliamentmonitor/actions/workflows/codeql.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/codeql.yml)\n[![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)\n[![Release](https://github.com/Hack23/euparliamentmonitor/actions/workflows/release.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/release.yml)\n[![E2E Tests](https://github.com/Hack23/euparliamentmonitor/actions/workflows/e2e.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/e2e.yml)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/Hack23/euparliamentmonitor/badge)](https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor)\n\n### Documentation \u0026 Reports\n[![API Docs](https://img.shields.io/badge/API-Documentation-blue?logo=javascript)](https://euparliamentmonitor.com/docs/api/index.html)\n[![Coverage](https://img.shields.io/badge/Coverage-82%25-green?logo=vitest)](https://euparliamentmonitor.com/docs/coverage/index.html)\n[![E2E Report](https://img.shields.io/badge/E2E-Report-purple?logo=playwright)](https://euparliamentmonitor.com/playwright-report/index.html)\n[![SLSA 3](https://img.shields.io/badge/SLSA-Level%203-brightgreen?logo=github)](https://github.com/Hack23/euparliamentmonitor/attestations)\n\n## 📚 Documentation Hub\n\n**📖 Quick Links:**\n- [📘 Architecture Documentation](SECURITY_ARCHITECTURE.md) - Complete security architecture with C4 diagrams\n- [📗 Security Flows](FLOWCHART.md) - Process flows with security controls\n- [📙 Data Model](DATA_MODEL.md) - Data structures and API integration\n- [📕 Release Process](docs/RELEASE_PROCESS.md) - How to create releases\n- [📔 API Documentation](https://euparliamentmonitor.com/docs/api/index.html) - TypeDoc-generated API reference\n- [📓 Test Coverage](https://euparliamentmonitor.com/docs/coverage/index.html) - Interactive coverage report\n\n**🔒 ISMS Compliance:**\n- [🛡️ Hack23 ISMS Framework](https://github.com/Hack23/ISMS-PUBLIC) - Information Security Management System\n- [🔐 Secure Development Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md) - Development standards\n- [📋 Classification Framework](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) - CIA triad classification\n\n## Current Status\n\n**MCP Server Integration**: The project uses the\n[European-Parliament-MCP-Server](https://github.com/Hack23/European-Parliament-MCP-Server)\nv1.2.8 for accessing real EU Parliament data via the Model Context Protocol.\n\n- **MCP Server Status**: ✅ Fully operational — 60+ EP data tools available\n  (feeds, direct lookups, analytical tools, intelligence correlation)\n- **Agentic Workflows**: 10 gh-aw markdown workflows for automated news\n  generation with AI-driven political intelligence analysis\n- **Fallback Mode**: News generation can work with reduced data when EP API\n  endpoints are temporarily unavailable\n- **Environment Variable**: Set `USE_EP_MCP=false` to disable MCP client\n  connection attempts\n\nEU Parliament Monitor is an automated news generation platform that monitors\nEuropean Parliament activities and generates multi-language news articles\ncovering:\n\n- **Week Ahead**: Preview of upcoming parliamentary events and committee\n  meetings\n- **Committee Reports**: Analysis of committee activities and decisions\n- **Propositions**: Government and parliamentary legislative proposals\n- **Motions**: Parliamentary motions and resolutions\n- **Breaking News**: Rapid-response coverage of significant developments\n\n## Features\n\n- 📰 **Automated News Generation**: Generate news articles about EU Parliament\n  activities\n- 🌍 **Multi-Language Support**: 14 languages including English, Swedish, German,\n  French, Spanish, Arabic, Japanese, and more\n- 📅 **Week Ahead Coverage**: Preview upcoming parliamentary events\n- 🤖 **GitHub Actions Integration**: Automated daily news generation\n- 📊 **SEO Optimized**: Proper metadata, structured data, and sitemap generation\n- ✅ **Code Quality**: ESLint, Prettier, and automated quality gates\n\n## 🔒 Security Architecture\n\nEU Parliament Monitor implements **security-by-design** with comprehensive\nsecurity controls and ISMS compliance.\n\n### Security Documentation\n\n- 📋 **[Security Architecture](SECURITY_ARCHITECTURE.md)** - Complete security\n  implementation overview with C4 diagrams, threat model, and compliance mapping\n- 🚀 **[Future Security Architecture](FUTURE_SECURITY_ARCHITECTURE.md)** -\n  Security enhancement roadmap (2026-2027)\n- 📊 **[Data Model](DATA_MODEL.md)** - Data structures and European Parliament\n  API integration\n- 📈 **[Security Flowcharts](FLOWCHART.md)** - Detailed process flows with\n  security controls\n\n### Security Posture\n\n**Project Classification** (per\n[ISMS Classification Framework](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) and\n[Open Source Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Open_Source_Policy.md)):\n\n- **Confidentiality**: Public (Level 1) - European Parliament open data\n- **Integrity**: Medium (Level 2) - News accuracy critical for democratic\n  transparency\n- **Availability**: Medium (Level 2) - Daily updates expected, 24h RTO acceptable\n- **RTO**: 24 hours | **RPO**: 1 day (daily generation schedule)\n- **Business Impact**: Low financial, Medium operational, Medium reputational\n- **Strategic Value**: Democratic transparency, open civic technology leadership\n\n**Key Security Controls**:\n\n- ✅ **Minimal Attack Surface**: Static site, no databases, no server-side\n  execution\n- ✅ **Automated Security**: CodeQL SAST, Dependabot SCA, npm audit\n- ✅ **Supply Chain Security**: SHA-pinned GitHub Actions, SBOM generation\n- ✅ **Input Validation**: Multi-layer XSS prevention, HTML sanitization\n- ✅ **Infrastructure Security**: GitHub-hosted ephemeral runners, HTTPS\n  enforcement\n- ✅ **Compliance**: ISO 27001, GDPR, NIS2, EU CRA aligned\n\n**Security Metrics**:\n\n- Zero known vulnerabilities (npm audit clean)\n- 82%+ code coverage with security tests\n- 100% dependency scanning coverage\n- 0 CodeQL critical/high findings\n\n### ISMS Alignment\n\nThis project follows\n[Hack23 ISMS Secure Development Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md):\n\n- ✅ Security architecture documentation (C4 models with Mermaid)\n- ✅ Threat modeling (STRIDE analysis)\n- ✅ Security testing (SAST, SCA, unit tests)\n- ✅ Compliance mapping (ISO 27001, GDPR, NIS2)\n\n## 🤝 Community \u0026 Governance\n\nEU Parliament Monitor is an open source project with transparent governance and community standards.\n\n### Open Source Standards\n\n- **[Contributing Guide](CONTRIBUTING.md)** - Development workflow, code standards, and contribution guidelines\n- **[Code of Conduct](CODE_OF_CONDUCT.md)** - Community standards based on Contributor Covenant 2.1\n- **[Security Policy](SECURITY.md)** - Vulnerability disclosure and security practices\n- **[Authors \u0026 Contributors](AUTHORS.md)** - Recognition of project contributors\n- **[License](LICENSE)** - Apache License 2.0 full text\n\n### Community Channels\n\n- **GitHub Issues**: Bug reports and feature requests\n- **GitHub Discussions**: Questions and community discussion\n- **Security**: [security@hack23.com](mailto:security@hack23.com) for vulnerability reports\n- **Conduct**: [conduct@hack23.com](mailto:conduct@hack23.com) for Code of Conduct issues\n\n### Governance Compliance\n\nThis project adheres to:\n- ✅ **OpenSSF Best Practices**: Following CII Best Practices criteria\n- ✅ **ISMS Compliance**: Aligned with Hack23 ISMS policies\n- ✅ **Transparent Development**: Public repository, open discussions\n- ✅ **Security First**: Comprehensive security disclosure policy\n\n## Code Quality \u0026 Testing\n\nEU Parliament Monitor maintains high code quality standards with comprehensive\ntesting:\n\n### Code Quality\n\n- **ESLint**: Comprehensive linting with security, complexity, and documentation\n  checks\n- **Prettier**: Consistent code formatting across all JavaScript files\n- **Pre-commit Hooks**: Automatic linting and formatting before every commit\n- **CI/CD Quality Gates**: Automated checks on every pull request\n- **TypeDoc/JSDoc**: Complete documentation for all functions\n\n**Code Standards**: See [docs/CODE_STANDARDS.md](docs/CODE_STANDARDS.md) for\ndetailed coding guidelines.\n\n### Testing Infrastructure\n\nComprehensive test suite with **Vitest** and **Playwright** covering all\nfunctionality:\n\n#### Unit \u0026 Integration Tests (Vitest)\n\n- **Unit Tests**: Article generation, MCP client, index/sitemap generation\n- **Integration Tests**: Full workflows, MCP integration, multi-language support\n- **Coverage**: ≥80% line coverage, ≥75% branch coverage\n- **Test Count**: 169+ tests covering critical paths\n\n```bash\n# Run unit \u0026 integration tests\nnpm test\n\n# Run with coverage\nnpm run test:coverage\n\n# Run tests in watch mode\nnpm run test:watch\n\n# Run with UI (browser interface)\nnpm run test:ui\n```\n\n#### End-to-End Tests (Playwright)\n\n- **E2E Tests**: Complete user experience validation\n- **Cross-Browser**: Chromium, Firefox, WebKit\n- **Mobile Support**: Mobile Chrome, Mobile Safari\n- **Accessibility**: WCAG 2.1 AA compliance with axe-core\n- **Responsive Design**: Multiple viewport sizes\n- **Test Count**: 60+ E2E tests covering user journeys\n\n```bash\n# Run E2E tests\nnpm run test:e2e\n\n# Run with UI (interactive)\nnpm run test:e2e:ui\n\n# Run in headed mode (see browser)\nnpm run test:e2e:headed\n\n# View test report\nnpm run test:e2e:report\n```\n\n**Testing Documentation**:\n\n- [test/README.md](test/README.md) - Unit \u0026 integration tests\n- [e2e/README.md](e2e/README.md) - E2E testing guide\n\n## Custom Agents\n\nEU Parliament Monitor includes **8 specialized GitHub Copilot custom agents** to\nstreamline development:\n\n- 🤖 **[product-task-agent](.github/agents/product-task-agent.md)** - Product\n  specialist for issue creation and coordination\n- 📰 **[news-journalist](.github/agents/news-journalist.md)** - The\n  Economist-style European Parliament reporting\n- 🎨 **[frontend-specialist](.github/agents/frontend-specialist.md)** -\n  HTML5/CSS3/WCAG 2.1 AA UI/UX expert\n- 🔄\n  **[data-pipeline-specialist](.github/agents/data-pipeline-specialist.md)** -\n  European Parliament MCP integration expert\n- ⚙️ **[devops-engineer](.github/agents/devops-engineer.md)** - CI/CD and GitHub\n  Actions automation\n- 🔒 **[security-architect](.github/agents/security-architect.md)** - ISMS,\n  GDPR, NIS2 compliance expert\n- 📚 **[documentation-architect](.github/agents/documentation-architect.md)** -\n  C4 models and architecture docs\n- ✅ **[quality-engineer](.github/agents/quality-engineer.md)** - Testing,\n  validation, and accessibility\n\n**Usage Example**:\n\n```bash\n# Use product-task-agent to analyze repository and create improvement issues\n@product-task-agent analyze the multi-language support and create issues for any gaps\n\n# Use news-journalist to generate content\n@news-journalist create a week-ahead article for the upcoming plenary session\n\n# Use frontend-specialist for UI improvements\n@frontend-specialist make the language switcher fully keyboard accessible\n```\n\n**Learn More**: See [Custom Agents Documentation](.github/agents/README.md) for\ndetailed agent capabilities, usage patterns, and examples.\n\n## Languages Supported\n\n- **Nordic**: English (en), Swedish (sv), Danish (da), Norwegian (no), Finnish (fi)\n- **EU Core**: German (de), French (fr), Spanish (es), Dutch (nl)\n- **Middle East**: Arabic (ar), Hebrew (he)\n- **East Asia**: Japanese (ja), Korean (ko), Chinese (zh)\n\n## Requirements\n\n- **Node.js**: Version 25 or higher\n- **npm**: Version 10 or higher (comes with Node.js 25)\n- **Git**: For cloning the repository\n\nYou can verify your Node.js version with:\n```bash\nnode --version  # Should be v25.x.x or higher\nnpm --version   # Should be 10.x.x or higher\n```\n\n## Installation\n\n### As an npm Package\n\n```bash\nnpm install euparliamentmonitor\n```\n\n### TypeScript / ES Module Usage\n\n```typescript\nimport {\n  // MCP Client for EU Parliament data\n  EuropeanParliamentMCPClient,\n  getEPMCPClient,\n  // Intelligence analysis\n  scoreVotingAnomaly,\n  analyzeCoalitionCohesion,\n  assessPoliticalThreats,\n  // Article generation\n  generateArticleHTML,\n  scoreArticleQuality,\n  // Multi-language support (14 languages)\n  ALL_LANGUAGES,\n  LANGUAGE_NAMES,\n  // Content validation\n  validateArticleContent,\n  validateTranslationCompleteness,\n} from 'euparliamentmonitor';\n\n// Or import specific modules for tree-shaking\nimport { EuropeanParliamentMCPClient } from 'euparliamentmonitor/mcp/ep-mcp-client';\nimport type { ArticleCategory, LanguageCode } from 'euparliamentmonitor/types';\n```\n\n### From Source (Development)\n\n```bash\n# Clone the repository\ngit clone https://github.com/Hack23/euparliamentmonitor.git\ncd euparliamentmonitor\n\n# Install dependencies\nnpm install\n```\n\n### Optional: European Parliament MCP Server\n\nFor real EU Parliament data integration, install the MCP server:\n\n```bash\n# Clone the MCP server repository\ngit clone https://github.com/Hack23/European-Parliament-MCP-Server.git\ncd European-Parliament-MCP-Server\n\n# Install dependencies and build\nnpm install\nnpm run build\n\n# The server will be available at dist/index.js\n# You can install it globally or reference the path\n```\n\nConfigure the MCP server path in environment variables:\n\n```bash\nexport EP_MCP_SERVER_PATH=\"/path/to/European-Parliament-MCP-Server/dist/index.js\"\n```\n\n**Note**: The MCP server is currently in development. News generation works\nwithout it using placeholder content.\n\n## Usage\n\n### Generate News Articles\n\n```bash\n# Generate week ahead article in English\nnpm run generate-news -- --types=week-ahead --languages=en\n\n# Generate multiple article types in multiple languages\nnpm run generate-news -- --types=week-ahead,committee-reports --languages=en,de,fr\n\n# Generate in all eu-core preset languages\nnpm run generate-news -- --types=week-ahead --languages=eu-core\n\n# Generate in all supported languages\nnpm run generate-news -- --types=week-ahead --languages=all\n```\n\n### Generate Indexes and Sitemap\n\n```bash\n# Generate language-specific index pages\nnpm run generate-news-indexes\n\n# Generate sitemap.xml\nnpm run generate-sitemap\n```\n\n### Local Development\n\n```bash\n# Serve the site locally\nnpm run serve\n\n# Open http://localhost:8080 in your browser\n```\n\n## Project Structure\n\n```\neuparliamentmonitor/\n├── .github/\n│   ├── agents/                      # Custom GitHub Copilot agents\n│   ├── workflows/                   # CI/CD workflow configurations\n│   └── release-drafter.yml          # Release notes configuration\n├── src/                             # TypeScript source (compiles to scripts/)\n│   ├── constants/                   # Language data, configuration\n│   ├── generators/                  # News, index, sitemap generators\n│   ├── mcp/                         # European Parliament MCP client\n│   ├── templates/                   # HTML article templates\n│   ├── types/                       # Shared TypeScript interfaces\n│   └── utils/                       # File utilities, metadata\n├── scripts/                         # Compiled JavaScript output\n│   ├── constants/                   # Compiled constants\n│   ├── generators/                  # Compiled generators\n│   ├── mcp/                         # Compiled MCP client\n│   ├── templates/                   # Compiled templates\n│   ├── types/                       # Compiled type definitions\n│   └── utils/                       # Compiled utilities\n├── news/                            # Generated news articles\n│   └── metadata/                    # Generation metadata\n├── test/                            # Vitest unit \u0026 integration tests\n├── e2e/                             # Playwright E2E tests\n├── docs/                            # Generated documentation\n├── styles.css                       # Article styling\n├── index-{lang}.html                # Language-specific index pages\n├── typedoc.json                     # TypeDoc configuration\n├── tsconfig.json                    # TypeScript configuration\n├── sitemap.xml                      # SEO sitemap\n└── package.json                     # Project dependencies\n```\n\n## CI/CD \u0026 Automation\n\n### GitHub Actions Workflows\n\nThe repository includes comprehensive GitHub Actions workflows for automation\nand quality assurance:\n\n#### 📰 News Generation\n\n- **Schedule**: Runs daily at 06:00 UTC\n- **Manual Trigger**: Can be triggered manually with custom parameters\n- **Automatic Commit**: Commits and pushes generated articles automatically\n- **Workflow**: `.github/workflows/news-generation.yml`\n\n**Workflow Inputs:**\n\n- `article_types`: Comma-separated list of article types (default: `week-ahead`)\n- `languages`: Languages to generate (`en`, `eu-core`, `all`, or custom list)\n- `force_generation`: Force generation even if recent articles exist\n\n#### 🏷️ PR Labeling\n\n- **Automatic**: Labels PRs based on file changes\n- **Configuration**: `.github/labeler.yml`\n- **Workflow**: `.github/workflows/labeler.yml`\n- **Setup**: Run `.github/workflows/setup-labels.yml` once to create all labels\n\n#### 📦 Release Management\n\n- **Automated Release Notes**: Via Release Drafter\n- **Semantic Versioning**: Based on PR labels\n- **SBOM \u0026 Attestations**: Security compliance with artifact attestations\n- **Workflow**: `.github/workflows/release.yml`\n- **Configuration**: `.github/release-drafter.yml`\n\n#### 🔒 Security Scanning\n\n- **CodeQL**: Automated security analysis on push, PR, and weekly schedule\n- **OpenSSF Scorecard**: Supply chain security assessment (weekly, on branch protection changes)\n- **Dependabot**: Weekly dependency updates for npm and GitHub Actions\n- **Dependency Review**: Vulnerability scanning on pull requests\n- **Vulnerability Scanning**: Automated npm audit in PR validation\n- **Workflows**: `.github/workflows/codeql.yml`, `.github/workflows/scorecards.yml`, `.github/dependabot.yml`, `.github/workflows/dependency-review.yml`\n\n#### 🏆 Compliance \u0026 Quality\n\n- **REUSE Compliance**: License header verification (FSFE REUSE specification)\n- **SonarCloud Analysis**: Automatic server-side code quality, security vulnerabilities, and technical debt tracking\n- **SLSA Provenance**: Level 3 build attestations with SBOM generation on releases\n- **Workflows**: `.github/workflows/reuse.yml`, `.github/workflows/release.yml`\n\n#### ✅ Test \u0026 Validation\n\n- **HTML Validation**: Automated htmlhint checks\n- **Functional Tests**: News generation, index, and sitemap validation\n- **Security Checks**: npm audit for vulnerabilities\n- **Workflow**: `.github/workflows/test-and-report.yml`\n\n**📊 Evidence:** See [Workflow Status Badges](#-status-badges) at top of README.\n### Workflow Status Badges\n\n**Core Workflows:**\n\n[![News Generation](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/news-generation.yml)\n[![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)\n[![E2E Tests](https://github.com/Hack23/euparliamentmonitor/actions/workflows/e2e.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/e2e.yml)\n\n**Security Workflows:**\n\n[![CodeQL](https://github.com/Hack23/euparliamentmonitor/actions/workflows/codeql.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/codeql.yml)\n[![OpenSSF Scorecard](https://github.com/Hack23/euparliamentmonitor/actions/workflows/scorecards.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/scorecards.yml)\n[![Dependency Review](https://github.com/Hack23/euparliamentmonitor/actions/workflows/dependency-review.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/dependency-review.yml)\n\n**Compliance Workflows:**\n\n[![REUSE Compliance](https://github.com/Hack23/euparliamentmonitor/actions/workflows/reuse.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/reuse.yml)\n[![SLSA Provenance](https://github.com/Hack23/euparliamentmonitor/actions/workflows/release.yml/badge.svg)](https://github.com/Hack23/euparliamentmonitor/actions/workflows/release.yml)\n\n### Manual Release Process\n\nTo create a new release:\n\n1. Go to **Actions** → **Release** workflow\n2. Click **Run workflow**\n3. Enter version (e.g., `v1.0.0`)\n4. Select if pre-release\n5. The workflow will:\n   - Run validation and tests (169 unit tests, E2E tests)\n   - Generate API documentation (TypeDoc)\n   - Generate test coverage reports (Vitest HTML)\n   - Generate E2E test reports (Playwright)\n   - Create documentation index\n   - Commit documentation to main branch\n   - Generate SBOM and attestations (SLSA Level 3)\n   - Create GitHub release with artifacts\n   - Update release notes automatically\n\n**🔒 ISMS Evidence:**\n- [Release Workflow](.github/workflows/release.yml) - Complete automation\n- [SLSA Attestations](https://github.com/Hack23/euparliamentmonitor/attestations) - Build provenance\n- [Release Process Guide](docs/RELEASE_PROCESS.md) - Step-by-step documentation\n\n### Documentation as Code\n\nEvery release automatically generates comprehensive documentation:\n\n| Documentation | Description | Link |\n|--------------|-------------|------|\n| **API Documentation** | TypeDoc-generated API reference from TypeScript source | [View Docs](https://hack23.github.io/euparliamentmonitor/docs/api/) |\n| **Test Coverage** | Interactive Vitest coverage reports (82%+) | [View Coverage](https://hack23.github.io/euparliamentmonitor/docs/coverage/) |\n| **E2E Test Reports** | Playwright test results with screenshots | [View Report](https://hack23.github.io/euparliamentmonitor/playwright-report/) |\n| **Documentation Index** | Beautiful hub linking all reports | [View Index](https://hack23.github.io/euparliamentmonitor/docs/) |\n\n**📋 How It Works:**\n1. Release workflow runs all tests\n2. Generates API docs with TypeDoc\n3. Copies coverage reports to `docs/`\n4. Creates documentation index page\n5. Commits everything to `main` branch\n6. Documentation is version-controlled and traceable\n\n**🎯 Run Locally:**\n```bash\nnpm run docs:generate  # Generate all documentation\nnpm run docs:api       # Generate API docs only\nnpm run docs:index     # Generate index page\n```\n\n**🔒 ISMS Compliance:**\n- 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)\n- All releases include complete documentation evidence\n- Documentation committed to repository for full auditability\n\n### Setting Up Labels\n\nFirst-time setup requires running the label creation workflow:\n\n1. Go to **Actions** → **Setup Repository Labels**\n2. Click **Run workflow**\n3. Wait for completion\n4. Labels will be automatically applied to future PRs\n\n## Configuration\n\n### Language Presets\n\n- `en` - English only\n- `eu-core` - English, German, French, Spanish, Dutch\n- `nordic` - English, Swedish, Danish, Norwegian, Finnish\n- `all` - All 14 supported languages\n\n### Article Types\n\n- `week-ahead` - Preview of upcoming parliamentary events\n- `committee-reports` - Committee activity analysis (coming soon)\n- `propositions` - Legislative proposals analysis (coming soon)\n- `motions` - Parliamentary motions analysis (coming soon)\n- `breaking` - Breaking news coverage (coming soon)\n\n## Contributing\n\nWe welcome contributions from developers, journalists, translators, and security researchers!\n\n### How to Contribute\n\nPlease read our comprehensive [Contributing Guide](CONTRIBUTING.md) for:\n- Development workflow and setup instructions\n- Code quality requirements and testing standards\n- Pull request process and review guidelines\n- Security best practices and ISMS compliance\n- Multi-language contribution guidelines\n\n### Code of Conduct\n\nThis 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).\n\n### Security\n\nIf you discover a security vulnerability, please follow our [Security Policy](SECURITY.md) for responsible disclosure. **Do not** report security issues through public GitHub issues.\n\n### Contributors\n\nSee [AUTHORS.md](AUTHORS.md) for a list of contributors who have helped make this project possible.\nContributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines on:\n\n- Code quality requirements (ESLint, Prettier, JSDoc)\n- Testing requirements (80% line coverage, 75% branch coverage)\n- Security requirements (input validation, XSS prevention, dependency scanning)\n- Commit message format (conventional commits)\n- Pull request process\n\n**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).\n\n## Security Policy\n\nFor security vulnerability reporting and disclosure process, please see [SECURITY.md](SECURITY.md).\n\n**Responsible Disclosure**:\n- Report vulnerabilities privately via GitHub Security Advisories\n- 48-hour acknowledgment, 7-day validation, 30-day remediation for critical issues\n- Public recognition for security researchers (unless anonymity requested)\n\n## Badge Maintenance\n\n### Maintaining Security Badge Status\n\nEU Parliament Monitor maintains security excellence through continuous compliance with OpenSSF best practices:\n\n#### OpenSSF Scorecard (Target: ≥7.0)\n\n**Current Optimizations**:\n- ✅ Branch protection on `main` branch\n- ✅ Required code review for pull requests\n- ✅ SHA-pinned GitHub Actions\n- ✅ CodeQL SAST enabled\n- ✅ Dependabot alerts enabled\n- ✅ SECURITY.md present\n- ✅ No dangerous workflow patterns\n\n**Monitoring**: View current score at [OpenSSF Scorecard Dashboard](https://scorecard.dev/viewer/?uri=github.com/Hack23/euparliamentmonitor)\n\n#### CII Best Practices (Target: Passing → Silver → Gold)\n\n**Requirements Met**:\n- ✅ Public version control (GitHub)\n- ✅ Public issue tracker (GitHub Issues)\n- ✅ LICENSE file (Apache-2.0)\n- ✅ CONTRIBUTING.md with clear guidelines\n- ✅ CODE_OF_CONDUCT.md\n- ✅ SECURITY.md with vulnerability reporting\n- ✅ Documentation in README\n- ✅ Automated testing (Vitest + Playwright, ≥80% coverage)\n- ✅ Static analysis (CodeQL, ESLint)\n- ✅ Dependency scanning (Dependabot, npm audit)\n\n**Registration**: Complete questionnaire at [CII Best Practices](https://bestpractices.coreinfrastructure.org/)\n\n#### SLSA Level 3 (Status: ✅ Implemented)\n\n**Provenance Generation**:\n- ✅ Automated on releases via `.github/workflows/release.yml`\n- ✅ Build attestations using `actions/attest-build-provenance@v2`\n- ✅ SBOM generation using SPDX format\n- ✅ Artifacts uploaded to GitHub Releases\n\n**Verification**: View attestations at `https://github.com/Hack23/euparliamentmonitor/attestations/`\n\n#### FOSSA License Compliance\n\n**Setup Required**:\n1. Sign up at [FOSSA](https://fossa.com/)\n2. Connect GitHub repository\n3. Configure license policy (Apache-2.0 compatible only)\n\n**Badge**: Updates automatically after scan completion\n\n#### REUSE Compliance (Status: ✅ Implemented)\n\n**Compliance Verification**:\n- ✅ `.reuse/dep5` covers all files without headers\n- ✅ Apache-2.0 license applied to all project files\n- ✅ Copyright notices: \"2024-2026 Hack23 AB\"\n\n**Workflow**: Runs on push, pull requests, and weekly via `.github/workflows/reuse.yml`\n\n### ISMS Policy References\n\nThis project adheres to [Hack23 ISMS](https://github.com/Hack23/ISMS-PUBLIC) policies:\n\n| Policy | Relevance | Implementation |\n|--------|-----------|----------------|\n| [**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 |\n| [**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) |\n| [**Secure Development Policy**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md) | Development security standards | SECURITY_ARCHITECTURE.md, SAST/SCA/DAST |\n| [**Threat Modeling Policy**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Threat_Modeling.md) | Threat analysis requirements | STRIDE analysis in THREAT_MODEL.md |\n| [**Vulnerability Management**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Vulnerability_Management.md) | Remediation SLAs | SECURITY.md disclosure timeline |\n| [**Classification Framework**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/CLASSIFICATION.md) | Data classification | Public/Medium/Medium (L1/L2/L2) |\n| [**Incident Response Plan**](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Incident_Response_Plan.md) | Security incident procedures | Linked in SECURITY.md |\n\n### Compliance Frameworks\n\nEU Parliament Monitor aligns with multiple compliance frameworks:\n\n| Framework | Controls | Evidence |\n|-----------|----------|----------|\n| **ISO 27001** | A.12.6.1 (Vulnerability Management), A.14.2.8 (Security Testing) | CodeQL, Dependabot, npm audit |\n| **NIST CSF 2.0** | Identify, Protect, Detect, Respond, Recover | SECURITY_ARCHITECTURE.md compliance matrix |\n| **CIS Controls v8.1** | 18.3 (Remediate Vulnerabilities), 2.7 (Allowlisting) | Automated scanning, SBOM |\n| **GDPR** | Data Protection by Design | European Parliament open data (public) |\n| **NIS2** | Article 20, 21 (Cybersecurity Risk Management) | Threat model, security controls |\n| **EU Cyber Resilience Act** | SBOM, Vulnerability Disclosure, Annex I/V | [CRA-ASSESSMENT.md](CRA-ASSESSMENT.md), SLSA provenance, SECURITY.md |\n\n## 🤖 AI-Disrupted News Generation \u0026 Agentic Intelligence\n\n\u003e *\"While traditional newsrooms debate whether AI will replace journalists,\n\u003e EU Parliament Monitor quietly deployed 8 autonomous AI agents that generate\n\u003e investigative political intelligence in 14 languages before most reporters\n\u003e have finished their morning coffee. The future of parliamentary journalism\n\u003e didn't send a memo — it opened a pull request.\"*\n\nThe 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.\n\n### 📰 Agentic News Generation Architecture\n\n**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:\n\n```mermaid\ngraph LR\n    subgraph \"📅 Daily Cycle (Mon-Fri)\"\n        CR[\"🏛️ Committee Reports\u003cbr/\u003e04:00 UTC\"]\n        PR[\"📜 Propositions\u003cbr/\u003e05:00 UTC\"]\n        MO[\"⚖️ Motions\u003cbr/\u003e06:00 UTC\"]\n    end\n\n    subgraph \"📆 Weekly Cycle\"\n        WA[\"📋 Week Ahead\u003cbr/\u003eFri 07:00 UTC\"]\n        WR[\"📊 Weekly Review\u003cbr/\u003eSat 09:00 UTC\"]\n    end\n\n    subgraph \"📅 Monthly Cycle\"\n        MA[\"🔭 Month Ahead\u003cbr/\u003e1st 08:00 UTC\"]\n        MR[\"📈 Monthly Review\u003cbr/\u003e28th 10:00 UTC\"]\n    end\n\n    subgraph \"🎛️ On-Demand\"\n        AG[\"🚀 Article Generator\u003cbr/\u003eManual Dispatch\"]\n    end\n\n    MCP[\"🔌 EP MCP Server\u003cbr/\u003e46 Tools · Live Data\"]\n\n    MCP --\u003e CR \u0026 PR \u0026 MO \u0026 WA \u0026 WR \u0026 MA \u0026 MR \u0026 AG\n\n    style CR fill:#1a5276,color:#fff\n    style PR fill:#1a5276,color:#fff\n    style MO fill:#1a5276,color:#fff\n    style WA fill:#117a65,color:#fff\n    style WR fill:#117a65,color:#fff\n    style MA fill:#7d3c98,color:#fff\n    style MR fill:#7d3c98,color:#fff\n    style AG fill:#b9770e,color:#fff\n    style MCP fill:#c0392b,color:#fff\n```\n\n| Workflow | Schedule | Focus | Output |\n|----------|----------|-------|--------|\n| 🏛️ **Committee Reports** | Mon–Fri 04:00 UTC | Committee decisions \u0026 activities | 14 language articles |\n| 📜 **Propositions** | Mon–Fri 05:00 UTC | Legislative proposals analysis | 14 language articles |\n| ⚖️ **Motions** | Mon–Fri 06:00 UTC | Motions \u0026 resolutions analysis | 14 language articles |\n| 📋 **Week Ahead** | Fridays 07:00 UTC | Upcoming parliamentary preview | 14 language articles |\n| 📊 **Weekly Review** | Saturdays 09:00 UTC | Past week retrospective | 14 language articles |\n| 🔭 **Month Ahead** | 1st of month 08:00 UTC | Strategic monthly outlook | 14 language articles |\n| 📈 **Monthly Review** | 28th of month 10:00 UTC | Monthly retrospective analysis | 14 language articles |\n| 🚀 **Article Generator** | Manual dispatch | Multi-type article generation | Configurable |\n\n### 🧠 The Intelligence Stack\n\nThe 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:\n\n```mermaid\ngraph TB\n    subgraph \"🤖 8 Core News Pipeline Agents\"\n        A1[\"📰 News Journalist\u003cbr/\u003e\u003ci\u003eEconomist-style reporting\u003c/i\u003e\"]\n        A2[\"🔄 Data Pipeline\u003cbr/\u003e\u003ci\u003eMCP integration\u003c/i\u003e\"]\n        A3[\"🎨 Frontend\u003cbr/\u003e\u003ci\u003eWCAG 2.1 AA\u003c/i\u003e\"]\n        A4[\"✅ Quality Engineer\u003cbr/\u003e\u003ci\u003eTesting \u0026 validation\u003c/i\u003e\"]\n        A5[\"🔒 Security Architect\u003cbr/\u003e\u003ci\u003eISMS compliance\u003c/i\u003e\"]\n        A6[\"📚 Documentation\u003cbr/\u003e\u003ci\u003eC4 \u0026 architecture\u003c/i\u003e\"]\n        A7[\"⚙️ DevOps Engineer\u003cbr/\u003e\u003ci\u003eCI/CD automation\u003c/i\u003e\"]\n        A8[\"📋 Product Task\u003cbr/\u003e\u003ci\u003eIssue management\u003c/i\u003e\"]\n    end\n\n    subgraph \"⚙️ 21 CI/CD Workflows\"\n        W1[\"8 News Generation\"]\n        W2[\"5 Security \u0026 Compliance\"]\n        W3[\"2 Testing\"]\n        W4[\"2 Release \u0026 Deploy\"]\n        W5[\"4 Automation \u0026 Infra\"]\n    end\n\n    subgraph \"📊 Data Layer\"\n        MCP[\"🔌 EP MCP Server\u003cbr/\u003e46 Tools\"]\n        TS[\"📦 39+ TypeScript Modules\"]\n        L14[\"🌍 14 Languages\"]\n    end\n\n    A1 --\u003e W1\n    A2 --\u003e MCP\n    A7 --\u003e W2 \u0026 W3 \u0026 W4\n    W1 --\u003e TS --\u003e L14\n\n    style A1 fill:#2e86c1,color:#fff\n    style A2 fill:#2e86c1,color:#fff\n    style A3 fill:#2e86c1,color:#fff\n    style A4 fill:#2e86c1,color:#fff\n    style A5 fill:#2e86c1,color:#fff\n    style A6 fill:#2e86c1,color:#fff\n    style A7 fill:#2e86c1,color:#fff\n    style A8 fill:#2e86c1,color:#fff\n    style W1 fill:#1a5276,color:#fff\n    style W2 fill:#7d3c98,color:#fff\n    style W3 fill:#117a65,color:#fff\n    style W4 fill:#b9770e,color:#fff\n    style MCP fill:#c0392b,color:#fff\n    style TS fill:#1c2833,color:#fff\n    style L14 fill:#117a65,color:#fff\n```\n\n### 🚀 Future Advance: AI Evolution Roadmap (2026–2037)\n\n\u003e *\"We're not just keeping up with AI — we're building the editorial infrastructure\n\u003e for the era when machines understand parliamentary procedure better than most MEPs.\"*\n\nThe 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)**.\n\n```mermaid\ntimeline\n    title EU Parliament Monitor — AI Evolution Roadmap\n    section Phase 1 (2026)\n        Agentic News : 8 autonomous workflows\n                     : 14-language generation\n                     : MCP data integration\n                     : Economist-style analysis\n    section Phase 2 (2027)\n        Predictive Analytics : Voting outcome prediction\n                             : Legislative impact forecasting\n                             : Cross-party coalition detection\n                             : Automated trend analysis\n    section Phase 3 (2028–2029)\n        Multi-Modal Intelligence : Video plenary analysis\n                                 : Real-time debate tracking\n                                 : Infographic auto-generation\n                                 : Autonomous content pipelines\n    section Phase 4 (2030–2031)\n        Near-Expert Analysis : 50+ parliament coverage\n                             : Expert-level policy briefs\n                             : Predictive governance models\n                             : Universal language support\n    section Phase 5 (2032–2033)\n        Global Coverage : 100+ parliaments\n                        : Pre-AGI capabilities\n                        : Real-time policy impact\n                        : Cross-jurisdiction analysis\n    section Phase 6 (2034–2037)\n        AGI Era : Transformative democracy\n               : 195 national legislatures\n               : Policy prediction before proposal\n               : Human oversight maintained\n```\n\n### 🤖 Phase 6: AGI Era \u0026 Transformative Democracy (2034–2037)\n\nWhen AGI or near-AGI systems become available, the platform architecture is designed to scale responsibly:\n\n| Capability | Description |\n|-----------|-------------|\n| 🤖 **Autonomous Analysis** | AGI-powered real-time political intelligence across all 195 national legislatures |\n| 🌐 **Universal Language Support** | Every UN language supported natively — no translation pipeline, native generation |\n| 📊 **Predictive Governance** | Policy impact prediction *before* legislation is proposed — anticipatory intelligence |\n| ⚖️ **Ethical AI Governance** | Human oversight maintained regardless of AI capability level — democratic safeguards hardcoded |\n| 🛡️ **Democratic Safeguards** | Platform architecture prevents weaponization or manipulation — transparency by design |\n\n### 📈 AI Model Evolution Strategy\n\n**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).\n\nProjected 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.\n\n| Year | Projected Workflow Definitions | AI Model | Key Capability |\n|------|-------------------------------|----------|----------------|\n| **2026** | 44–50 | Opus 4.7–4.9 | 🟢 Agentic news generation |\n| **2027** | 50–55 | Opus 5.x | 🔵 Predictive analytics |\n| **2028** | 55–65 | Opus 6.x | 🟣 Multi-modal content |\n| **2029** | 65–75 | Opus 7.x | 🟠 Autonomous pipeline |\n| **2030** | 75–85 | Opus 8.x | 🔴 Near-expert analysis |\n| **2031–2033** | 85–100 | Opus 9–10.x / Pre-AGI | ⚪ Global coverage |\n| **2034–2037** | 100–120+ | AGI / Post-AGI | ⭐ Transformative platform |\n\n```mermaid\n%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#1a5276', 'primaryTextColor': '#fff', 'lineColor': '#2e86c1', 'secondaryColor': '#117a65'}}}%%\nxychart-beta\n    title \"Projected Workflow Definitions \u0026 Variants (2026–2037)\"\n    x-axis [\"2026\", \"2027\", \"2028\", \"2029\", \"2030\", \"2031\", \"2032\", \"2033\", \"2034\", \"2035\", \"2036\", \"2037\"]\n    y-axis \"Workflow definitions \u0026 variants\" 0 --\u003e 130\n    bar [44, 53, 60, 70, 80, 88, 94, 100, 105, 110, 115, 120]\n    line [44, 53, 60, 70, 80, 88, 94, 100, 105, 110, 115, 120]\n```\n\n### 📚 Detailed Roadmap Documentation\n\n| Document | Focus | Coverage |\n|----------|-------|----------|\n| 📘 **[Future Mindmap](FUTURE_MINDMAP.md)** | Capability evolution \u0026 system vision | 2026–2037 AI/ML roadmap, multi-parliament expansion, API ecosystem |\n| 📗 **[Future Workflows](FUTURE_WORKFLOWS.md)** | CI/CD evolution \u0026 automation roadmap | Security hardening, performance optimization, AGI-ready pipelines |\n\n## License\n\nCopyright 2024-2026 Hack23 AB\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\nSee [LICENSE](LICENSE) file for full details.\n\n## Credits\n\nThis project is based on the news generation implementation from\n[Hack23/riksdagsmonitor](https://github.com/Hack23/riksdagsmonitor).\n\n## Author\n\nHack23 AB - Intelligence Operations Team\n","funding_links":["https://github.com/sponsors/Hack23"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhack23%2Feuparliamentmonitor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhack23%2Feuparliamentmonitor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhack23%2Feuparliamentmonitor/lists"}