- 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>
107 lines
6.0 KiB
Markdown
107 lines
6.0 KiB
Markdown
# 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üsselwort `wbs`), 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`/`prod` gelten 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 auf
|
|
`fertig`, 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.
|