✨ Highlights
Diese Version behebt eine Regression, die das Laden von Assets auf GitHub-Pages-Projektseiten kaputt gemacht hat (#175), härtet die Auto-Install-Pipeline gegen Shell-Injection (CWE-78) und entfernt @docmd/plugin-pwa aus der Standardinstallation (es war nie ein Core-Plugin).
Keine Breaking Changes. Keine neuen erforderlichen Konfigurationen. Bestehende Configs, Plugins und CI-Pipelines funktionieren unverändert.
🐛 Fix: GitHub-Pages-Projektseiten — alle Assets 404 (#175)
Benutzer, die auf https://username.github.io/repo-name/ deployten, sahen nach dem Upgrade von 0.8.9 für jede CSS-, JS- und Bilddatei einen 404. Die Ursache: 0.8.10 fügte ein <base href="/">-Tag hinzu, um ein separates Workspace-Problem zu beheben, wodurch der Browser alle relativen URLs gegen den Domain-Root statt gegen den Unterpfad auflöste.
Der Fix: docmd leitet den Asset-Basispfad nun automatisch aus Ihrer url-Konfiguration ab. Wenn url https://username.github.io/my-repo ist, setzt docmd base intern auf /my-repo/. Es ist keine manuelle base-Konfiguration erforderlich.
{
"url": "https://username.github.io/my-repo"
}
Das ist alles. docmd übernimmt den Rest.
Benutzer, die base explizit gesetzt haben, sind nicht betroffen. Die Ableitung istSlash-tolerant bei url und base — "my-repo", "/my-repo" und "/my-repo/" funktionieren alle.
🔒 Sicherheit: Shell-Injection im Auto-Install (CWE-78)
Der Auto-Install-Pfad für Plugins baute einen Shell-String-Befehl, indem der Paketname in pnpm add ${pkg} interpoliert wurde. Ein Paketname mit Shell-Metazeichen konnte beliebige Befehle unter dem Benutzerkonto ausführen.
Der Fix: ein neues gemeinsames Modul (packages/api/src/runtime-deps.ts) ersetzt den Shell-String durch spawn(pm, args, { shell: false }) mit einem festen Argument-Array. Ein strenger Regex-Validator und ein Registry-Lookup wirken als Defence-in-Depth. Der Auto-Install-Pfad kann nicht mehr zu einem generischen npm install-Loader umfunktioniert werden.
🧰 Gemeinsames runtime-deps-Modul
Der Plugin-Loader (hooks.ts) und der Engine-Loader (engine.ts) pflegten jeweils eine eigene Kopie der Auto-Install-Pipeline. Beide nutzen nun runtime-deps.ts. Ein Installationsverhalten, überall angewendet. Der TUI-Status-Reporter ist pro Build idempotent, sodass Dev-Server-Rebuilds keine doppelten [ WAIT ]- / [ DONE ]-Zeilen erzeugen.
🛠 Engine-Auto-Install
Das Anfordern von engine: "rust" in der Konfiguration fiel bisher direkt auf JS zurück, wenn @docmd/engine-rust nicht installiert war. Der neue Ablauf versucht, engine-rust zuerst zu installieren; schlägt die Installation fehl oder ist die native Binärdatei auf der Plattform nicht verwendbar, wird auf JS zurückgegriffen und der Grund wird in einer [ FAIL ]-Zeile angezeigt.
📦 Korrigierte Core-Abhängigkeiten
@docmd/plugin-pwa war als direkte Abhängigkeit von @docmd/core gelistet, gehörte aber nie zu CORE_PLUGINS. Jedes npm install @docmd/core hat es installiert, auch für Benutzer, die PWA nie aktiviert haben.
Der Fix: @docmd/plugin-pwa aus packages/core/package.json#dependencies entfernt. Es wird nun bei Bedarf installiert, genauso wie math, threads und alle anderen optionalen Plugins.
📐 Testabdeckung
51 neue Assertions in tests/cli-contracts/runtime-deps.test.js: öffentliche API, Validator (12 positive, 13 negative Fälle inklusive Shell-Metazeichen), Registry-Cache-Idempotenz, Install-Verweigerungs-Pfade und statische Quellcode-Prüfungen.
Migration
Null. Bestehende Configs, Plugins und CI-Pipelines funktionieren unverändert.
Vollständiges Changelog: https://github.com/docmd-io/docmd/compare/0.8.11...0.8.12