Templates sind jetzt Plugins. Das erste offizielle Template, Summer, wird zusammen mit zwei neuen optionalen UI-Features ausgeliefert — Cookie-Zustimmung und eine Ankündigungsleiste — direkt eingebaut in @docmd/ui. Außerdem enthält dieses Release einen Docker-:latest-Fix, damit der Quickstart out of the box funktioniert, sowie eine Reihe weiterer Härtungs-Fixes nach der Veröffentlichung (siehe unten).
✨ Was ist neu
Templates sind jetzt Plugins
Ein Template-Paket deklariert capabilities: ['template'] und liefert Layout-Overrides sowie eigene CSS/JS. Der neue Resolver prüft vier Ebenen und fällt auf jeder Stufe auf den Standard zurück:
frontmatter.template → config.templates[glob] → config.theme.template → eingebauter Standard
// template-summer/index.js
export default {
plugin: { name: 'template-summer', version: '0.1.0', capabilities: ['template'] },
templates: [
{ type: 'layout', templatePath: '...' },
{ type: 'sidebar', templatePath: '...' },
],
templateAssets: [
{ type: 'css', path: '.../summer.css', priority: 10, position: 'head' },
],
};
Templates können jeden der 14 unterstützten Slots überschreiben (layout, 404, sidebar, header, footer, banner, cookie-consent und weitere) und können pro Seite über Frontmatter oder seitenweit über die Config gesetzt werden. Das customCss des Nutzers hat immer Vorrang — Templates dürfen kein !important verwenden.
Templates — Architektur & Authoring-Guide
☀️ Summer — das erste offizielle Template
Ein helles, luftiges Layout mit Suchleiste oben, sanften Halo-Akzenten und einem dichteren Karten-Raster.
docmd add summer # installiert und schaltet die Config um
docmd remove summer # kehrt zum Standard zurück
🍪 Cookie-Zustimmungsdialog
Im Standard-UI eingebaut. Deaktiviert, bis Sie ihn aktivieren.
{
"cookie": {
"enabled": true,
"message": "We use cookies to ensure you get the best experience.",
"policyUrl": "/privacy",
"position": "bottom-right",
"expiryDays": 180
}
}
Löst bei Auswahl ein docmd:cookie-consent-Event aus, auf das Plugins und Templates reagieren können.
📢 Seitenweite Ankündigungsleiste
Sitzt über der Menubar. Unterstützt Inline-Markdown oder rohes HTML.
{
"layout": {
"banner": {
"content": "**v0.9 erscheint am Freitag** — lesen Sie die Ankündigung.",
"type": "info",
"link": { "text": "Mehr lesen", "url": "/blog/v0-9" }
}
}
}
Der Schließ-Zustand wird pro Session gespeichert, sodass die Leiste bei einem neuen Besuch wieder erscheint.
Behoben
| Problem | Lösung |
|---|---|
Docker-:latest-Tag wurde nie veröffentlicht |
Der Workflow versieht Releases jetzt automatisch mit dem :latest-Tag |
Quickstart stürzte bei leerem /docs in Docker ab |
Der Entrypoint seedet /docs aus dem mitgelieferten Template, wenn leer |
| Docker-Healthcheck meldete stets „unhealthy" | Prüft jetzt die Ports 3000–3005, um der Auto-Inkrementierung des Dev-Servers zu folgen |
| i18n-Strings wurden in Sidebar/Nav-Partials nicht übersetzt | t() wird jetzt an alle Layout-Partials übergeben; 13 fehlende Schlüssel in allen 7 Sprachen ergänzt |
| Code-Kopierschaltfläche schwebte über dem Code-Block | Die Schaltfläche verankert sich nun am äußeren Wrapper statt an einem inneren |
| Mermaid-Diagramme brachen bei SPA-Navigation (nicht bei vollem Reload) | Plugin-<script>-Tags werden nun bei jedem Seitenwechsel ins Live-DOM synchronisiert, nicht nur beim ersten Laden |
| Sidebar-Gruppen mit echten Links wurden nur erweitert, nie navigiert | Der Klick-Handler matcht nun auch echte Links, nicht nur das Toggle-Icon |
appearance: "system" bewirkte nichts |
Das Default-Theme-Partial liest nun DOCMD_APPEARANCE (den kanonischen Namen) und übernimmt localStorage nur dann, wenn es einen konkreten Light/Dark-Wert enthält |
| Nicht-englische Suchergebnisse sprangen an den Seitenanfang statt zur Überschrift | Der semantische Such-Client verwendet nun eine Unicode-bewusste Slug-Reguläre, passend zum Parser-seitigen Generator (behebt Chinesisch, Japanisch, Koreanisch, Kyrillisch, Diakritika) |
| Dev-Server baute alle paar Sekunden ohne Änderungen neu auf | Ein neuer Inhalts-Signatur-Tracker ignoriert Phantom-fs.watch-Events von Spotlight/iCloud/Time Machine; der Config-Watcher beobachtet nun das übergeordnete Verzeichnis statt der Datei selbst |
tag-Container akzeptierte weder Anführungszeichen-URLs noch das external:-Präfix |
Die Parser-Reguläre unterstützt nun "..." und '...' um Optionswerte; url: ist der kanonische Eigenschaftsname, link: bleibt als Alias erhalten |
Verbessert
- Sinnvolle Config-Defaults — eine frische
docmd.config.json(oder gar keine Config) liefert jetzt eine voll ausgestattete Site: Seitennavigation, Code-Kopierschaltflächen, Brotkrumen, Suche, Theme-Switch und mehr sind alle standardmäßig aktiv. Vollständige Defaults-Tabelle → - Bedingtes Laden von Plugin-Assets — Plugins können jetzt eine
conditionfür ihre Assets deklarieren, sodass JS/CSS nur auf Seiten geladen werden, die sie tatsächlich benötigen. Auf dem Playground verifiziert: Mermaids ~500 KB Bibliothek wird nun auf 3/11 Seiten geladen (vorher 11/11) und KaTeX’ ~30 KB CSS auf 1/1 Mathe-Seite (vorher 11/11). - Schlankere UI — Header- und Menubar-Höhe von 52px auf 44px reduziert; kleinere Heading-Anchor-Icons; dichteres Karten-Raster.
- Neue Standard-404-Seite — Glaskarten-Layout mit weichem Halo-Hintergrund, Aktionen „Return Home" / „Go Back", vollständig übersetzt und RTL-fähig.
- Kontrast-Pass — Text- und Link-Farben in Light- und Dark-Theme wurden angepasst, um WCAG AA zu erfüllen.
- Aktiver Sidebar-Link neu gestaltet — eine „Knoten-am-Faden"-Pille ersetzt den alten linken Rand.
- Tastatur-Fokus ist jetzt sichtbar —
:focus-visibleerhält seitenweit einen Halo-Glow. - Schritt-Permalinks — jedes
<li>in einer docmd-Steps-Liste trägt nun eine global eindeutigeid="step-N"und ein verstecktes Link-2-Icon, das bei Hover oder Fokus eingeblendet wird, sodass sich einzelne Schritte leicht teilen und direkt verlinken lassen. - Changelog-Eintrags-Permalinks — spiegelt das Schritt-Permalink-Muster: jedes Changelog-Eintragsdatum trägt nun eine
idund ein verstecktes Link-2-Icon, das bei Hover eingeblendet wird, sodass sich einzelne Releases leicht teilen und direkt verlinken lassen. --verboseist nun universell — zuvor nur vonadd/removebeachtet. Setzt nunDOCMD_VERBOSE=truein der Umgebung, sodass jeder Unterbefehl (build, dev, live, init, validate) auf ausführliche Logs opt-in kann, und wird zusätzlich anbuildSiteundbuildLivefür den strukturierten Pfad weitergereicht.- Docker-Image funktioniert ohne weitere Einrichtung —
docker run ghcr.io/docmd-io/docmd:latestseedet jetzt automatisch eine Demo-Site; kein Volume-Mount erforderlich. - Sidebar-Nav-Doppelklick-Bug — das Haupt-UI-Skript konnte unter bestimmten Serving-Bedingungen doppelt geladen werden, wodurch Klick-Handler zweimal feuerten und der Nav-Zustand stecken blieb. Jetzt gegen Doppel-Ausführung geschützt.
xdg-open-Absturz im Dev-Server — eine fehlende Browser-Start-Binary bringtdocmd devnicht mehr zum Absturz.- Fehlende Runtime-Dependency in
@docmd/plugin-search—markdown-itwar fälschlicherweise als dev-only gelistet; die Plugin-Installation funktioniert nun auf Anhieb. - Docker-Tags vereinfacht — Releases veröffentlichen jetzt genau zwei Tags: die Versionsnummer und
:latest.
Ausblick — Node 20+ in v0.9.0
Das nächste Minor-Release hebt den Floor auf Node.js 20+ (von 18+) an und bringt die Engine-Anforderung, die ausgelieferte Docker-Laufzeit und die CI-Umgebung alle auf Node 22. Node 18 ist im April 2025 EOL gegangen; so bleibt docmd auf einer unterstützten Laufzeit mit ausreichend Puffer.
Dieses Release (0.8.7) ist nicht betroffen — der >=18-Floor bleibt bestehen, bis 0.9.0 erscheint.
| Jetzt (0.8.x) | Nächste (0.9.0) | |
|---|---|---|
| Minimum Node | 18+ | 20+ |
| Docker-Basis | 20-alpine |
20-alpine |
| Type Node | ^24 | ^24 |
| CI-Ziel | 24 | 24 |
Skills-Update (docmd-skills@1.1.0)
Skills wurden mit 0.8.7 auf 3 spezialisierte Skills aktualisiert, die zusammenarbeiten. Der Agent wählt automatisch den relevantesten Skill basierend auf der aktuellen Aufgabe und dem Kontext aus, was den Token-Verbrauch reduziert und gleichzeitig die Genauigkeit erhält.
npx docmd-skills [dir]
Ersetzen Sie [dir] durch das Verzeichnis, in dem Sie Agent-Skills ablegen — gängige Optionen sind ~/.claude/skills/, ~/.cursor/skills/ oder ein projektlokaler Ordner wie ./.skills/.