feat(libreplan): read-only REST-import als specialist-module (#1240) #1255

Merged
brenno merged 10 commits from feat/libreplan-connector into main 2026-08-05 00:36:24 +00:00
Owner

Summary

  • LibrePlan-connector als optionele, alleen-lezen REST-importmodule. Haalt een projectsnapshot op van een LibrePlan-instantie en vult OciDeck-slides: Gantt, WBS, projectstatus, milestones, kritiek pad, resources, timesheet, resourcebelasting.
  • Off by default, desktop-only, GET-only. NetGuard-blokkade voor privé-adressen (tenzij trustedInternal), HTTPS verplicht (tenzij trustedInternal), redirect-weigering, response-cap 10 MiB, depth-limited XML (100). Wachtwoord in OS-keychain, niet in prefs of deck.
  • Vier lagen: XML-parser (pure Dart), REST-client (NetGuard + pinning), converters (models → slides), import-orchestrator. Elk met eigen tests.
  • Settings UI: module-kaart op Uitbreidingen-tab, LibrePlan-tab met formulier + verbindingstest, import-dialoog met per-slide-type checkboxes.
  • Docs: PRIVACY.md, SECURITY.md, USER_GUIDE.nl.md, CHANGELOG, SOURCE_MAP.

Bewaker-toets

De implementatie respecteert alle tien kernwaarden:

  • Soevereiniteit (3): de connector praat met de gebruiker's eigen LibrePlan-instantie, niet met een nieuwe externe partij. Uitgaand verkeer staat standaard uit.
  • Veiligheid (1): fail-closed (parse-error → leeg, geen crash), NetGuard, HTTPS-verplicht, redirect-weigering, response-cap, depth-limited XML.
  • Uitwisselbaarheid: geïmporteerde slides gebruiken bestaande slide-types (timeline, tree, table, chart, cockpit, flow) — geen nieuwe _class-tokens of sidecar-formaten. Het .md-bestand blijft leesbaar in ander gereedschap.

Geen waarde-conflicten die expliciete afweging vereisen.

make check-full

Alle poorten groen: format, analyze, toolchain, conventions, privacy projection boundary, method length, dead code, hardcoded text, comment language, improvement templates, version bump, SBOM, coverage (87.4%), per-file coverage floor, gitleaks, trufflehog, semgrep, shellcheck, licences, SBOM up-to-date, bundled JS, web hardening, release artefacts.

Test plan

  • make check groen
  • make check-full groen (secrets + SAST + web + release)
  • 17 converter-tests, 4 client-tests, XML-tests, import-tests, settings-model-tests, import-dialog-widget-tests
  • Bewaker-toets uitgevoerd (zie boven)
  • Beeldkeuring: handmatig controleren dat het LibrePlan-tabblad er goed uitziet in de settings-dialoog

Closes #1240

Generated with Devin

## Summary - **LibrePlan-connector** als optionele, alleen-lezen REST-importmodule. Haalt een projectsnapshot op van een LibrePlan-instantie en vult OciDeck-slides: Gantt, WBS, projectstatus, milestones, kritiek pad, resources, timesheet, resourcebelasting. - **Off by default, desktop-only, GET-only.** NetGuard-blokkade voor privé-adressen (tenzij trustedInternal), HTTPS verplicht (tenzij trustedInternal), redirect-weigering, response-cap 10 MiB, depth-limited XML (100). Wachtwoord in OS-keychain, niet in prefs of deck. - **Vier lagen:** XML-parser (pure Dart), REST-client (NetGuard + pinning), converters (models → slides), import-orchestrator. Elk met eigen tests. - **Settings UI:** module-kaart op Uitbreidingen-tab, LibrePlan-tab met formulier + verbindingstest, import-dialoog met per-slide-type checkboxes. - **Docs:** PRIVACY.md, SECURITY.md, USER_GUIDE.nl.md, CHANGELOG, SOURCE_MAP. ### Bewaker-toets De implementatie respecteert alle tien kernwaarden: - **Soevereiniteit (3):** de connector praat met de gebruiker's *eigen* LibrePlan-instantie, niet met een nieuwe externe partij. Uitgaand verkeer staat standaard uit. - **Veiligheid (1):** fail-closed (parse-error → leeg, geen crash), NetGuard, HTTPS-verplicht, redirect-weigering, response-cap, depth-limited XML. - **Uitwisselbaarheid:** geïmporteerde slides gebruiken bestaande slide-types (timeline, tree, table, chart, cockpit, flow) — geen nieuwe _class-tokens of sidecar-formaten. Het .md-bestand blijft leesbaar in ander gereedschap. Geen waarde-conflicten die expliciete afweging vereisen. ### make check-full Alle poorten groen: format, analyze, toolchain, conventions, privacy projection boundary, method length, dead code, hardcoded text, comment language, improvement templates, version bump, SBOM, coverage (87.4%), per-file coverage floor, gitleaks, trufflehog, semgrep, shellcheck, licences, SBOM up-to-date, bundled JS, web hardening, release artefacts. #### Test plan - [x] make check groen - [x] make check-full groen (secrets + SAST + web + release) - [x] 17 converter-tests, 4 client-tests, XML-tests, import-tests, settings-model-tests, import-dialog-widget-tests - [x] Bewaker-toets uitgevoerd (zie boven) - [ ] Beeldkeuring: handmatig controleren dat het LibrePlan-tabblad er goed uitziet in de settings-dialoog Closes #1240 Generated with [Devin](https://devin.ai)
brenno force-pushed feat/libreplan-connector from f7636352c2
Some checks failed
static-gate / static-gate (pull_request) Has been cancelled
scans / scans (pull_request) Has been cancelled
to 4460093c5e
All checks were successful
scans / scans (pull_request) Successful in 2m17s
static-gate / static-gate (pull_request) Successful in 4m22s
2026-08-05 00:34:51 +00:00
Compare
brenno merged commit d1d28c0ff2 into main 2026-08-05 00:36:24 +00:00
Sign in to join this conversation.
No description provided.