✨ 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 Versionsverzeichnisver.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.cjsin@docmd/engine-rustprüft jetzt auf geschwisterlicherust-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:*undsearch: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