Beim gemeinsamen Arbeiten an einem Pad (D31) fehlte das Naheliegendste: „schau mal hier". Etherpad zeigt die Cursor der anderen im Pad, aber Werkbaum kommt nicht an sie heran — ein fremdstämmiger Rahmen gibt keinen DOM-Zugriff, der Klartext-Export überträgt nur Text. Eine Marke IM Text ist damit nicht der Notbehelf, sondern der einzige Weg. Und sie hat etwas, das ein Cursor nicht hat: alle sehen dieselbe Stelle. Erkannt wird `!!!` nur ALLEINSTEHEND (`(^|\s)!!!(?=\s|$)`), sonst verlöre jedes „Achtung!!!" seine Ausrufezeichen und niemand fände den Grund. Bewusst ohne Lookbehind — Safari kennt es erst ab 16.4, und die Notation soll nicht an einer Browserversion hängen. Position in der Extraktion (SPEC §1): nach den Tags; der Kommentar fällt vorher weg, eine Marke hinter `%%` wirkt also nicht. Darstellung ist DIESELBE wie die der Cursor-Zeile (D25), nicht eine vierte: neben Fokusrahmen, Strahlenkranz (D28) und Cursor-Ring wäre ein weiterer Ring ein Zeichen zu viel — es gibt nur einen Begriff „hier schauen". Preis: Im Bild ist nicht zu unterscheiden, ob die eigene Cursor-Zeile oder eine fremde Marke leuchtet; für Screenreader benennt `a11yFocusMark` es ausdrücklich. Ins Bild geholt wird nur bei ÄNDERUNG der Marke, Schlüssel ist der Label-Text statt der Zeilennummer (Umsortieren im Pad soll nicht neu scrollen). Ohne diese Bedingung zöge jeder Neubau den Blick zurück und man käme nicht weg. Beides geprüft: gleiche Marke -> Scrollstand bleibt 0, Marke gewandert -> springt auf 242 und markiert den neuen Knoten. Beim Hinsehen gefunden: Die Pfad-Inversion verschluckte den Zeigefinger. Der erste markierte Knoten im Test war eine nicht gewählte any-of-Alternative („Headless CMS") — `opacity:.32; saturate(.4)`, der Ring praktisch unsichtbar. Der Zeiger zeigte auf nichts. Dieselbe Ausnahme wie für D28 behebt es, und hier ist sie zwingender: „Sollten wir diese verworfene Alternative noch einmal ansehen?" ist einer der wahrscheinlichsten Gründe, überhaupt zu zeigen. Anders als beim optionalen Knoten (D29), wo das Zurücktreten die Aussage IST. Nicht im Druck und nicht im Grafikexport (wie die Cursor-Zeile): Die Marke sagt „schau jetzt hierhin", nicht „so ist der Plan". Nicht ins kanonische Beispiel (SPEC §10) aufgenommen — das ist zugleich Test-Fixture, ein dauerhafter Zeigefinger darin wäre eine Aussage, die niemand gemacht hat. Verworfen war `%%!` (Kommentar-Variante, bliebe harmlos liegen und könnte die Begründung tragen) — der Nutzer wählte `!!!`, weil es im Moment des Zeigens schnell zu tippen ist, und genau dann will man nicht über Syntax nachdenken. Der Preis steht in D32: die Marke bleibt sichtbar stehen, bis jemand sie löscht; Werkbaum kann sie nicht entfernen (kein Schreibzugriff auf das Pad). SPEC §1/§9 zuerst, dann D32, dann Code. 15 neue Tests (86 -> 101), Legende und i18n in allen 9 Sprachen.
108 lines
4.8 KiB
Plaintext
108 lines
4.8 KiB
Plaintext
%% Werkbaum, planned with Werkbaum — what exists today and where it could go.
|
|
%% Distilled from docs/ROADMAP.md, docs/TASKS.md and docs/DECISIONS.md.
|
|
|
|
[~] Werkbaum (XXL) https://github.com/mhoennig/werkbaum
|
|
- [^] Notation (L)
|
|
- [^] Line format (M)
|
|
- [^] Status box, eight states (S)
|
|
- [^] T-shirt size and the "decompose from M" rule (S)
|
|
- [^] People tags, bare URLs, %% comments (XS)
|
|
- [^] And/or decomposition (S)
|
|
- [x] Optional nodes — neither required nor an alternative (S)
|
|
- [-] A separate storage format for the structure (L) %% the text is the format
|
|
- [ ] Ticket references #123 (S)
|
|
- [?] Benefit per node, not only cost (M)
|
|
| [?] Another sigil next to the size (S)
|
|
| [?] Story points behind the T-shirt sizes (M)
|
|
- [~] Editor (XL) https://werkbaum.javagil.de
|
|
- [^] Live diagram from text (M)
|
|
- [^] Parser (S)
|
|
- [^] Renderer, three layout modes (M)
|
|
- [^] Horizontal fan (S)
|
|
- [^] Vertical, transposed (S)
|
|
- [^] Compact (S)
|
|
- [^] Cheapest path (M)
|
|
- [^] Cost model, missing size counts as M (S)
|
|
- [^] Metro-map line through the leaves (S)
|
|
- [^] Export (M)
|
|
- [^] SVG and PNG download (S)
|
|
- [^] PNG to the clipboard (S)
|
|
+ [^] Print stylesheet (XS)
|
|
- [^] Nine interface languages (M)
|
|
- [^] Translations (S)
|
|
- [^] Default taken from the browser (XS)
|
|
- [^] Accessibility: aria labels, focus order (S)
|
|
- [^] Works on a phone (S)
|
|
- [^] Several documents in one editor (M)
|
|
- [^] Switcher in the editor title bar (S)
|
|
- [^] Load a document from ?sourceUrl= (S)
|
|
- [^] Jump between diagram and text (S)
|
|
- [ ] Open and save .werkbaum files (S)
|
|
+ [x] Show what is new since your last visit (S)
|
|
+ [?] A pastel colour per person (S)
|
|
- [?] Dates and milestones (M)
|
|
| [?] An attribute in the line (S)
|
|
| [?] A separate timeline view (L)
|
|
- [^] Build and delivery (M)
|
|
- [^] One self-contained file, bundled by Vite (S)
|
|
- [^] Unit tests (S)
|
|
- [^] Published on every push (S)
|
|
- [-] Deploy through a gh-pages branch (S) %% GitHub Actions instead
|
|
- [-] Fonts from Google (XS) %% self-hosted, no third-party request
|
|
- [ ] Backend (XL)
|
|
- [ ] Kotlin and Spring Boot scaffold (M)
|
|
- [ ] Gradle Kotlin DSL, JDK 21 (S)
|
|
- [ ] Health endpoint and CI (S)
|
|
- [ ] Documents on the server (L)
|
|
- [ ] Text plus metadata, no structure format (M)
|
|
- [ ] REST endpoints (S)
|
|
- [ ] Persistence (S)
|
|
- [ ] Share by link (S)
|
|
- [?] Accounts and permissions (L)
|
|
| [?] Single user, one token (S)
|
|
| [?] Log in with OIDC (L)
|
|
- [~] Working together on one plan (XL)
|
|
- [x] Watch a shared Etherpad — it merges, we render (S)
|
|
- [x] Load the pad's plain-text export (XS)
|
|
- [x] Reload on demand (XS) %% a timer only trips Etherpad's rate limit
|
|
- [x] Embed the pad, keep the text mirror beside it (M)
|
|
- [x] Three views: pad and text, pad only, text only (S)
|
|
- [x] Splitter between pad and mirror (XS)
|
|
- [x] A shared pointer: !!! focuses a node for everyone (XS)
|
|
- [ ] Git as the shared store (L)
|
|
| [ ] A file in a repository, changed by pull request (S) %% works today, no code
|
|
| [?] The backend commits every change (L)
|
|
- [?] History and restore (M)
|
|
- [?] Diff between two versions (S)
|
|
- [?] Who changed this line (S)
|
|
- [?] A branch per scenario (S)
|
|
- [?] Live editing, several people at once (XL)
|
|
- [ ] Transport over a websocket (S) %% the easy half
|
|
- [!] Merging simultaneous edits (L) %% the actual work
|
|
| [?] Text CRDT — the plan is plain text, so it fits (L)
|
|
| [?] Operational transformation (XL)
|
|
- [?] Cursors and who else is here (S)
|
|
- [-] A merge algorithm of our own (XL) %% solved problem, do not reinvent
|
|
- [?] Mermaid plugin (XL)
|
|
- [!] A layout engine of its own (XL) %% measure, place, route — the real work
|
|
- [ ] Measure node sizes (M)
|
|
- [ ] Text metrics without a browser (S)
|
|
- [ ] Badges and tags inside the box (S)
|
|
- [ ] Place nodes and route connectors (L)
|
|
- [ ] All-of fan (M)
|
|
- [ ] Horizontal (S)
|
|
- [ ] Transposed (S)
|
|
- [ ] Any-of rail (S)
|
|
- [?] Registration with Mermaid (M)
|
|
| [?] External diagram, self-hosted pages only (M)
|
|
| [?] Pull request into Mermaid itself (L)
|
|
- [?] Tracker integration (XL)
|
|
| [?] Taiga (L) https://taiga.io
|
|
- [ ] Resolve #123 over the REST API (M)
|
|
- [ ] Read title, link and status (S)
|
|
- [ ] Map the workflow onto the states (S)
|
|
- [?] Write the status back (M)
|
|
- [-] A plugin inside Taiga itself (L) %% legacy frontend, self-hosted only
|
|
| [?] Tenzu, the successor (XXL) https://tenzu.net
|
|
| [ ] No tracker, plain text is enough (XS)
|