3065243f73
fix: parser en CSS voor additionele artikelen Grondwet
...
- Artikel nr zoekt nu alleen in <kop> of direct child (niet recursief)
- Voorkomt "Artikel Artikel" bij items met <li.nr>=Artikel
- Lijst-parser verzamelt content correct (geen leading whitespace)
- CSS: overflow-wrap en pre overflow voor lange regels
2026-03-30 12:11:55 +02:00
8ee8522bdc
fix: UI opschonen — homepage, disclaimers, navigatie
...
- Homepage: geen Grondwet-hoofdstukken meer, wel duidelijke links
naar volledige tekst, AI-samenvatting, en historie
- Disclaimer op homepage: neutraal (geen "AI-verrijkt")
- Disclaimer op /grondwet: "automatisch omgezet van XML naar Markdown"
- /grondwet: blauwe banner met link naar AI-samenvatting
- Statistieken herordend (regelingen eerst)
2026-03-30 12:07:36 +02:00
9e254cc953
fix: force IPv4 voor Mistral embedding API (IPv6 timeout op Hetzner)
2026-03-30 11:57:10 +02:00
df8a520b87
fix: TemplateResponse API voor Starlette 1.0
2026-03-30 11:04:03 +02:00
479a557f86
feat: MVP change-alert systeem via AgentMail + Mistral
...
- alerts.py: detecteert wetswijzigingen, genereert AI change-summary,
stuurt e-mail via AgentMail API
- Mistral Large voor begrijpelijke samenvatting van de diff
- AgentMail endpoint: /inboxes/{addr}/messages/send
- Test: gesimuleerde Grondwet art. 13 wijziging succesvol verstuurd
Sluit #38
2026-03-30 10:52:22 +02:00
6db0f6afc3
feat: MVP webinterface
...
Server-rendered HTML via Jinja2 templates in FastAPI:
- Homepage: zoekbalk, statistieken, inhoudsopgave Grondwet
- /grondwet: volledige tekst als leesbare pagina
- /grondwet/samenvatting: AI-samenvatting (B1-niveau)
- /zoeken: keyword (Meilisearch) + semantisch (Qdrant)
- /historie: tijdlijn van versies
- /diff: visuele vergelijking tussen twee versies
- Sober, responsive CSS (overheidsstijl)
- Disclaimer op elke pagina
flake.nix: jinja2 + markdown packages toegevoegd
Sluit #39
2026-03-30 10:48:36 +02:00
b655f56f8c
feat: MVP semantisch zoeken via Qdrant + Mistral embeddings
...
- semantic.py: Qdrant client + Mistral embeddings indexer
- /api/v1/zoeken?mode=semantic — zoek op betekenis
- /api/v1/zoeken?mode=keyword — Meilisearch (default)
- 148 Grondwet-artikelen geëmbed
- Qdrant container draait op dt-prod-01
Voorbeeld: "mag mijn baas mijn e-mail lezen?" → Artikel 13 (briefgeheim)
Voorbeeld: "wanneer mag de politie mijn huis binnenkomen?" → Artikel 12 (score 0.789)
Sluit #37
2026-03-30 10:44:01 +02:00
af339652df
feat: MVP AI-samenvattingen via Mistral
...
- summarize.py: genereert B1-niveau samenvattingen per hoofdstuk
- Mistral Large API met lage temperature (0.3)
- Disclaimer en metadata in elk summary.md bestand
- Getest: Grondwet — 8 hoofdstukken samengevat in begrijpelijk Nederlands
Sluit #36
2026-03-30 10:38:55 +02:00
c3d1efc3df
feat: MVP Meilisearch full-text search
...
- search.py: Meilisearch client + indexer (per artikel)
- /api/v1/zoeken gebruikt nu Meilisearch (met grep fallback)
- Typo-tolerant: "godsdiensst" → vindt art. 1, 6, 23
- 1ms responstijd
- 176 artikelen Grondwet geïndexeerd
- Meilisearch container draait op dt-prod-01
Sluit #35
2026-03-30 10:30:21 +02:00
21be1367d1
feat: MVP FastAPI REST API
...
Endpoints:
- GET /health — health check
- GET /api/v1/regelingen — lijst (met type/status filter)
- GET /api/v1/regelingen/{bwb_id} — metadata
- GET /api/v1/regelingen/{bwb_id}/tekst — volledige Markdown
- GET /api/v1/regelingen/{bwb_id}/artikelen — artikellijst
- GET /api/v1/regelingen/{bwb_id}/artikelen/{nr} — specifiek artikel
- GET /api/v1/regelingen/{bwb_id}/versies — beschikbare toestanden
- GET /api/v1/regelingen/{bwb_id}/diff?van=...&tot=... — versievergelijking
- GET /api/v1/zoeken?q=... — full-text zoeken
- Swagger docs op /api/docs
Getest: zoek "godsdienst" → vindt art. 1, 6, 23 Grondwet.
Sluit #34
2026-03-30 10:27:12 +02:00
a7e4a4bc16
feat: MVP index.json generator + CLI tool
...
- indexer.py: genereert index.json met metadata per regeling
- CLI: show, search, diff, log commando's met Rich formatting
- flake.nix: shellHook echo naar stderr (stdout schoon voor tools)
wetgit show BWBR0001840 --artikel 1 → toont artikel 1 Grondwet
wetgit search "godsdienst" → vindt art. 1, 6, 23
Sluit #32 , #33
2026-03-30 10:23:20 +02:00
0de70d6be0
fix: flake.nix venv verwijderd, alleen nix Python
...
- .venv verwijderd — veroorzaakte path conflicts met nix packages
- PYTHONPATH=$PWD/src in shellHook zodat 'import wetgit' werkt
- Oude venv deactivatie in shellHook voor het geval
- agentmail via pip --user (enige PyPI-only package)
- setuptools/wheel/build verwijderd (niet nodig zonder venv)
2026-03-30 10:12:40 +02:00
40c36d612a
feat: historie-reconstructie pipeline
...
- history.py: reconstrueert volledige versiehistorie per regeling
- sru_client.py: fetch_all_toestanden() voor alle versies per BWB-ID
- Git commits met correcte author date (inwerkingtredings-datum)
- flake.nix: venv vervangen door PYTHONPATH + pip --user
Pilot: Grondwet (BWBR0001840) — 11 toestanden, 11 commits, 0 failures.
git diff toont exacte wetswijzigingen (bijv. art. 131 Grondwet).
Sluit #28 , #29 , #30 , #31
2026-03-30 07:37:47 +02:00
03402cdfa0
feat: dagelijkse sync pipeline + cron job
...
- sync.py: vergelijkt SRU catalogus met lokale staat, verwerkt delta's
- daily-sync.sh: wrapper script voor cron (lock, clone, pull, sync, push)
- Cron job: dagelijks om 03:00 op dt-prod-01
- Forgejo API token in group_vars voor git push authenticatie
Refs #9
2026-03-30 06:42:04 +02:00
188f41c7ee
docs: README herschrijven, data/ toevoegen aan gitignore
...
- Volledige projectbeschrijving, quick start, architectuur
- Pipeline documentatie en development instructies
- Disclaimer en licentie-informatie
- data/ directory (XML cache) gitignored
2026-03-30 06:40:06 +02:00
da7d11deb9
feat: BWB pipeline — SRU crawler, downloader, runner
...
- SRU client: crawlt zoekservice.overheid.nl voor alle BWB regelingen
- Downloader: haalt XML op van repository.officiele-overheidspublicaties.nl
- Pipeline runner: orchestreert crawl → download → parse → schrijf Markdown
- Deduplicatie: meerdere SRU toestanden → meest recente per BWB-ID
- Mappenstructuur conform PRD: wet/{slug}/{BWB_ID}/README.md
- CLI: python -m wetgit.pipeline.runner --output /path --type wet --limit N
Getest: 28 wetten succesvol gedownload en geparsed, 0 failures.
Refs #6
2026-03-29 21:27:47 +02:00
c481ebf9e7
feat: ansible deployment setup voor dt-prod-01
...
- Forgejo + Redis Docker stack (wetgit-forgejo role)
- FastAPI + Celery systemd services (wetgit-app role)
- Nginx vhosts voor git.wetgit.nl en api.wetgit.nl (wetgit-nginx role)
- SSL via Let's Encrypt (certbot webroot)
- Backup script (forgejo dump, geen downtime)
- Codeberg mirror script
- Cron jobs voor backup/mirror/log cleanup
- Ansible vault voor secrets (encrypted)
Geïsoleerd van dt-platform: eigen poorten, users, directories.
2026-03-29 21:24:47 +02:00
1dc93b0f89
feat: project scaffold + BWB XML parser
...
- pyproject.toml met wetgit package, pytest/ruff/black/mypy config
- BWB XML → Markdown parser (src/wetgit/pipeline/bwb_parser.py)
- Getest op ~400 regelingen over alle BWB-types
- 20 edge cases gevonden en opgelost:
- <boek>, <deel>, <kop> structuren
- <regeling-tekst>, <circulaire-tekst> containers
- <bijlage>, <enig-artikel>, <sub-paragraaf>, <divisie>
- CALS <table> → Markdown tabellen
- <nadruk>, <sup>, <sub> inline formatting
- <redactie>, <tussenkop>, <gereserveerd>, <vervallen>
- Nix flake devshell met alle dependencies
- CLI entrypoint (wetgit)
- Domain models (Regeling, Artikel)
Sluit #4 , sluit #5
2026-03-29 21:24:32 +02:00
bed91e891e
Initial commit
2026-03-29 08:15:21 +02:00