Commit graph

19 commits

Author SHA1 Message Date
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