- docs/ROADMAP.md: neuer Abschnitt „Gemeinsam an einem Diagramm arbeiten" in drei Stufen — Lesen teilen (?sourceUrl=, vorhanden), asynchron über Git (heute schon möglich, weil der Plan Text ist: git diff/blame sind lesbar; Ausbau = Backend committet jede Änderung), live tippen (Transport ist der kleinere Teil, das Zusammenführen gleichzeitiger Änderungen der eigentliche; Text-CRDT passt wegen D14 ohne eigene Merge-Logik). Notiert auch, warum Git direkt aus dem Browser kein Live-Sync ist (Sync auf Zuruf, CORS-Proxy nötig, Konfliktmarker mitten in der Notation) und was vor einer Entscheidung offen ist (erste Laufzeit-Abhängigkeit, Commit-Granularität, Rechte). - docs/examples/example-werkbaum.werkbaum: passender Zweig „Working together on one plan" (94 Knoten, parst ohne Warnung). Dabei aufgefallen: Das mitgelieferte Dokument wurde nur EINMAL angelegt — die Ergänzung hätte niemanden erreicht, der die Seite schon geöffnet hatte. `werkbaum-seeded` hält deshalb statt '1' den Fingerabdruck (FNV-1a) der ausgelieferten Fassung; bei neuer Fassung wird der Text nachgezogen, aber nur wenn der Nutzer ihn nicht bearbeitet hat. Gelöscht bleibt gelöscht. `resetToDefaults()` setzt den Merker mit. Verifiziert im Browser, vier Fälle: alte unveränderte Fassung wird nachgezogen (98 Zeilen, neuer Zweig da); selbst geänderter Text bleibt unangetastet; gelöschtes Dokument kehrt nicht zurück; frischer Zustand zeigt die neue Fassung (89 sichtbare Knoten, keine Warnung). Vitest 37/37. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
6.0 KiB
Roadmap
Nahziel: tragfähige Codebasis
- Single-HTML-Prototyp (
index.html) in Module zerlegen:parser,model,render,app. Parser und Renderer müssen headless (ohne DOM-Editor) nutzbar sein — Voraussetzung für alle Integrationen. - Testsuite gegen
docs/SPEC.md(kanonisches Beispiel als Fixture).
Mermaid-Plugin
Ziel: wbs-Blöcke in Mermaid-Umgebungen rendern.
- Offizieller Mechanismus:
mermaid.registerExternalDiagrams()mit Detektor (Schlüsselwortwbs), Parser, DiagramDB, Renderer. Präzedenzfälle: ZenUML (extern), Mindmap (ursprünglich extern, ebenfalls einrückungsbasierte Syntax). - Hauptaufwand: SVG-Renderer mit eigener Layout-Berechnung
(Knotenmaße messen, Positionen, Verbinder als Pfade) inkl. Mischlayout
und transponiertem Modus. Toggles werden zu Syntax-Optionen
(z. B.
wbs LR, Direktiven). - Einschränkungen: wirkt nur in selbst initialisierten Mermaid-Instanzen (nicht GitHub/GitLab/Notion); Lazy-Loading externer Diagramme galt zuletzt als experimentell. Für universelle Verfügbarkeit: PR als eingebautes Diagramm (Vorbild Mindmap/Kanban).
Taiga-Integration
Ziel: Knoten mit Taiga-Objekten verlinken, Status automatisch synchronisieren.
- Architektur nach Seedtime-Vorbild: Companion-Ansatz — der Editor (frontend/) plus ein Kotlin/Spring-Backend (backend/, D13) sprechen per REST-API mit Taiga; optional dünnes contrib-Frontend-Plugin (Menüpunkt im Projekt) und Backend-Paket (Speicherung in Taigas DB statt Wiki-Seite).
- Syntax-Erweiterung
#123: Referenz auf Epic/User Story/Task/Issue; App löst Titel, Link und Status per API auf. Status-Mapping Taiga-Workflow → Notation (z. B. „In progress“ →[~], „Done“ →[x]). - Aktualisierung: API-Abfrage beim Öffnen; Push via Webhooks. Rückrichtung (Status im WBS ändern → Taiga) möglich.
- Einschränkungen: Plugins nur self-hosted (nicht taiga.io-Cloud); Taiga 6 im Wartungsmodus, Frontend AngularJS-Altbestand — daher Companion-App bevorzugen.
Tenzu (Beobachten)
Nachfolger von „Taiga Next“; seit Ende Juli 2024 von der französischen Genossenschaft Biru entwickelt (Kaleidos fokussiert Penpot). Open Source, in laufender Entwicklung, Integrationsfähigkeit erklärtes Ziel — noch zu jung als Plattform-Ziel. Companion-App so schneiden, dass ein späterer Umzug Taiga → Tenzu nur den API-Adapter betrifft.
Gemeinsam an einem Diagramm arbeiten
Ziel: mehrere Personen ändern denselben Plan. Drei Stufen, aufeinander aufbauend — die dritte lohnt nur, wenn wirklich gleichzeitig gearbeitet wird.
1. Lesen teilen — vorhanden. ?sourceUrl= (D23) zeigt eine entfernte
Textdatei an; die Quelle wird anderswo gepflegt. Einbahnstraße, aber ohne
jeden Server.
2. Asynchron ändern über Git — heute schon möglich, ohne eine Zeile Code.
Die .werkbaum-Datei (D24) liegt im Repository, wird per Pull Request geändert
und per ?sourceUrl= angezeigt. Weil der Plan Text ist (D14), sind
git diff und git blame tatsächlich lesbar („wer hat Payment provider auf
[!] gesetzt?"). Für einen Plan, der sich pro Woche und nicht pro Sekunde
ändert, ist das oft die passendere Antwort — mit Review und Historie obendrauf.
Ausbau: Das Backend (D13) legt jede Änderung als Commit ab und bekommt
Historie, Wiederherstellung und Verzweigungen für Szenarien geschenkt.
Git direkt aus dem Browser ist technisch möglich (isomorphic-git spricht das
HTTP-Smart-Protokoll), taugt aber nicht als Live-Sync: Es synchronisiert auf
Zuruf statt fortlaufend, braucht wegen fehlender CORS-Header einen Proxy (SSH
scheidet im Browser ohnehin aus), und ein Konflikt landet als
<<<<<<<-Markierung mitten in der Notation — der Parser sähe kaputte Zeilen.
3. Live gemeinsam tippen — offen. Der Transport ist das kleinere
Problem (WebSocket; SSE + POST oder WebRTC als Alternativen). Die eigentliche
Frage ist, was passiert, wenn zwei Personen dieselbe Zeile ändern: Naives
„jede Änderung sofort in beide Richtungen" führt zu Textsprüngen unter dem
Cursor und verlorenen Zeichen. Erprobte Antworten sind Operational
Transformation (Google Docs) und CRDTs. Für Werkbaum fällt die Wahl
leicht, weil D14 das Format auf puren Text festgelegt hat: Ein Text-CRDT
(Y.Text in Yjs, oder Loro) passt ohne eigene Merge-Logik darauf; Cursor und
Anwesenheit fallen als Beigabe ab. Eigene Merge-Algorithmen sind hier kein
Betätigungsfeld — das Problem ist gelöst.
Offene Punkte vor einer Entscheidung: Yjs wäre die erste Laufzeit-Abhängigkeit überhaupt (CLAUDE: nicht ohne Rückfrage); wie CRDT- Zustand und Git-Historie zusammenspielen (Commit-Granularität — nicht jeder Tastendruck ein Commit); und wer bei einem Backend eigentlich was darf (Rechte, siehe „Accounts" im Werkbaum-Beispielplan).
Kleinere Ideen
- Deterministische Pastellfarbe pro
@name(Personen wiedererkennen). - Sichtbare Anmerkungen am Knoten (eigene Syntax, getrennt von
%%). - Aufwands-Rollup: Größen der Kinder aggregieren und mit Parent vergleichen.
(Größen sind ordinal, nicht additiv —
S+S ≠ M; braucht erst eine Mapping-Konvention, z. B. Story-Point-Werte hinter den Größen.) - Nutzen/Wert je Knoten (Gegenstück zur Kosten-Größe): eigenes Attribut für den
erwarteten Nutzen; erlaubt Nutzen/Kosten-Priorisierung (WSJF-artig) statt
reiner Kostenminimierung. Rollt analog zum Aufwands-Rollup hoch.
(Syntax offen — SPEC-first;
(…)/@/#/%%sind belegt, es braucht ein eigenes kollisionsfreies Zeichen.) - Gestaffelter „günstigster Pfad" (Ausbaustufen): die Pfad-Rechnung (D18)
status-bewusst machen —
fertig/prodgelten als erledigt (Hintergrund), hervorgehoben wird nur der günstigste noch offene Rest (aktuelle Front). Ist eine Alternativen-Gruppe komplett realisiert, springt der Pfad zur nächsten, per Nutzen gewählten Ausbaustufe weiter (Regel: erst die Kette auffertig, dann die nächste Stufe). Baut auf Nutzen + Aufwands-Rollup auf und erweitert D18 (heute rein statisch/kostenminimierend) um Nutzen- und Status-/Zeitachse. - Attribut-Syntax für Termine/Meilensteine.