✨ Highlights

Dieses Release konzentriert sich auf die Konsolidierung der Offline-Linkgenerierung, die Absicherung von Abhängigkeits-Installationen und optimierte Test-Ausführung. Behandelte Issues: #179 (Offline-Ordner-Navigations-Weiterleitungen), #167/#175 (SEO-Metadaten in Offline-Builds) und Sicherheits-Härtung gegen Command Injection (CWE-78) im Installer.

Darüber hinaus wurden Leistungsengpässe im Test-Runner behoben, wodurch die Test-Suite-Latenz von 15 Minuten auf unter 2 Minuten sank.

Keine Breaking Changes. Keine neue Konfiguration erforderlich. Bestehende Konfigurationen, Plugins und CI-Pipelines funktionieren unverändert.

🐛 Fix: Vereinheitlichte Offline-Navigation (#179)

Zuvor emittierten systemgenerierte Navigationselemente (Logo, Breadcrumbs, Versions-/Sprach-Umschalter, Sidebar) verzeichnisstilisierte Links (wie ./ oder /). Bei Betrachtung offline über file:// lösten Browser diese in Dateisystem-Verzeichnispfade auf statt in explizite HTML-Dateien, was zu Verzeichnis-Listings oder fehlerhaften Seiten führte.

Der Fix: die gesamte URL-Generierung wurde in eine einzige Wahrheitsquelle konsolidiert (packages/parser/src/utils/url-utils.ts). Navigationskomponenten laufen jetzt über gebundene Helfer (buildRelativeUrl und buildAbsoluteUrl). Im --offline-Modus lösen alle generierten URLs Verzeichnis-Endpunkte automatisch in explizite index.html-Ziele auf (z. B. ./index.html oder ../index.html), was eine fehlerfreie Navigation über lokale Dateisysteme sicherstellt.

🧹 SEO- & Metadaten-Robustheit (#167, #175, #177)

Canonical-Links, Open-Graph-Tags (og:url, og:image) und Twitter-Card-Tags erfordern absolute URLs. Wenn siteUrl fehlte oder das Projekt im --offline-Modus kompiliert wurde, lösten sich diese Tags in fehlerhafte root-relative Pfade wie /guide/ auf, was Metadaten-Fehler verursachte.

Der Fix: das SEO-Plugin prüft jetzt siteUrl und offline-Flags. Canonical- und Og/Twitter-Metadaten-Tags werden in Offline-Builds oder bei nicht konfiguriertem siteUrl weggelassen, es sei denn, sie sind explizit absolute URLs.

🔒 Sicherheit: Command-Spawning gehärtet (CWE-78)

Die Peer-Dependency-Installation innerhalb von @docmd/plugin-search wurde refaktorisiert, um Command-Injection-Risiken zu verhindern.

Der Fix: wir haben die Shell-basierte Ausführung (execSync) durch einen sicheren, zentralisierten Runtime-Dependency-Installer ersetzt. Paketmanager werden jetzt direkt über Argument-Arrays ohne Shell-Expansion gespawnt, was eine robuste plattformübergreifende Ausführung in CI- und Produktionsumgebungen sicherstellt.

⚡ Optimierung: Test-Suite-Abhängigkeitsauflösung

Die Feature-Integration- und Asset-Pipeline-Tests lösten zuvor kostspielige, netzwerkintensive Paketinstallationen (z. B. Download von docmd-search und dessen Peer-Dependencies) in temporären Testordnern aus, was die Ausführungszeit auf bis zu 15 Minuten trieb.

Der Fix: wir haben die Umgebungsvariable DOCMD_TEST_SEARCH_PATH eingeführt. Während Testläufen umgeht das Plugin externe npm-Paket-Downloads und löst Search- und Template-Dependencies direkt aus dem Monorepo-Workspace auf. Die gesamte Test-Suite läuft jetzt in unter zwei Minuten.

🚀 Optimierung: Inkrementelle Semantic-Indexing-Cache-Wiederverwendung

Zuvor kompilierte das Search-Plugin den Search-Index bei jedem Rebuild/Reload von Grund auf neu, was 30-42 Sekunden dauerte, da das Ausgabeverzeichnis (site/.docmd-search/) gelöscht wurde.

Der Fix:

  • Das Search-Plugin schreibt den Semantic-Index jetzt in das Dokumentquellverzeichnis (docs/.docmd-search/ oder Versionsverzeichnis ver.dir/.docmd-search/), das über Builds hinweg erhalten bleibt und in die Versionskontrolle eingecheckt wird.
  • Es führt inkrementelle Indizierung in diesem Ordner durch (wiederverwendet existierende Manifeste und Batch-Dateien) und kopiert die final generierten Index-Assets rekursiv ins Site-Ausgabeverzeichnis.
  • Dies führt zu einem 100x+ Build-Speedup (warme Rebuilds in unter 300ms).

⚙️ Rust-Engine Native-Addon-DX & Routing

  • Lokales Binary-Kopieren: postinstall.cjs in @docmd/engine-rust prüft jetzt auf geschwisterliche rust-binaries/bin/-Ordner, was die Rust-Engine während Entwicklung und Tests neuer Versionen vor der npm-CDN-Veröffentlichung nutzbar macht.
  • Task-Routing: Task-Routing wurde aktualisiert, um nur nativ unterstützte Tasks (file:* und search:index) an die Rust-Engine zu dispatchen, mit nahtlosem Fallback auf JS für nicht unterstützte Search-bezogene Tasks.

Migration

Null. Bestehende Konfigurationen, Plugins und CI-Pipelines funktionieren unverändert.

Vollständiges Changelog: https://github.com/docmd-io/docmd/compare/0.8.13...0.8.14