commit ded894a4da7226b96e071b94dad37e66361a20d2 Author: Michael Hoennig Date: Tue Jul 21 09:53:06 2026 +0200 initial, vibe-coded version, mostly frontend diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ec73cda --- /dev/null +++ b/.gitignore @@ -0,0 +1,61 @@ +# === Betriebssystem === +.DS_Store +Thumbs.db +Desktop.ini + +# === IntelliJ IDEA / JetBrains (D13) === +# Projektdateien lokal halten; geteilte Einstellungen ggf. gezielt wieder einchecken. +.idea/ +*.iml +*.ipr +*.iws +out/ + +# === Editoren === +.vscode/ +*.swp +*~ + +# === Backend: Gradle / Kotlin / JVM (D13) === +backend/.gradle/ +backend/build/ +backend/**/build/ +!backend/**/src/**/build/ +.gradle/ +build/ +!src/**/build/ +# Gradle-Wrapper einchecken, aber lokale Overrides ignorieren +!gradle/wrapper/gradle-wrapper.jar +!gradle/wrapper/gradle-wrapper.properties +gradle-app.setting + +# Spring Boot / lokale Laufzeit +*.log +logs/ +application-local.properties +application-local.yml +application-local.yaml + +# === Java-Artefakte === +*.class +*.jar +*.war +*.ear +hs_err_pid* +replay_pid* +!gradle-wrapper.jar + +# === Frontend (Vanilla HTML/CSS/JS, D11) === +# Derzeit build-frei; falls später Tooling dazukommt: +frontend/node_modules/ +frontend/dist/ + +# === Geheimnisse / lokale Umgebung === +.env +.env.local +*.local + +# === Temporäres === +tmp/ +*.tmp +*.bak diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..d7d6173 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,25 @@ +# Werkbaum + +Monorepo für Werkbaum: eine textuelle WBS-Notation mit Und/Oder-Zerlegung +(„all of" nebeneinander, „any of" untereinander) samt Editor und geplantem +Integrations-Backend. + +## Struktur +- `frontend/` — Editor (Vanilla HTML/CSS/JS). Eigene Regeln: frontend/CLAUDE.md +- `backend/` — Kotlin/Spring-Boot-Anwendung (Taiga-Integration, Persistenz). + Eigene Regeln: backend/CLAUDE.md +- `docs/` — Projektdokumente · `brand/` — Marke (brand/BRAND.md) + +## Verbindliche Referenzen +- Sprachdefinition: @docs/SPEC.md — die Notation ist der gemeinsame Vertrag + von Frontend und Backend. Syntaxänderungen: SPEC **zuerst**, dann Code. +- Entscheidungen: @docs/DECISIONS.md — respektieren; Abweichungen als neuen + Eintrag begründen, alte Einträge nie löschen. Besonders D13 (Backend-Stack) + und D14 (Parser-Hoheit) beachten. +- Ziele: docs/ROADMAP.md · Offene Arbeit: docs/TASKS.md (Checkboxen pflegen). + +## Querschnitts-Konventionen +- UI-Texte und Doku auf Deutsch. +- Keine neuen Laufzeit-Abhängigkeiten ohne Rückfrage (gilt in beiden Teilen). +- Der Notationstext ist das führende Datenformat; kein Teil erfindet ein + eigenes Speicherformat für die Struktur. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7d98206 --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +

+ Werkbaum-Logo +

+ +# Werkbaum + +Eine textuelle, Markdown-artige Notation für Projektstrukturpläne +(Work Breakdown Structure) mit Und/Oder-Zerlegung — und ein Live-Editor, +der sie als Diagramm rendert. + +``` +[~] Werkbaum (XL) https://wiki.example.de/relaunch + - [~] Dokumentenspeicher + | [x] Textdatei mit Copy+Paste im Frontend (S) + - [x] Parser + - [x] Texteingabefeld im Frontend + | [ ] Backend + - [~] Darstellung/Rendern (XL) + - [/] H (S) @anna + - [ ] CMS-Anbindung (M) + | [ ] WordPress + | [?] Headless CMS +``` + +`-` = Pflicht-Teilpaket (all of, im Diagramm nebeneinander) · +`|` = Alternative (any of, untereinander) · `[…]` = Status · +`(M)` = T-Shirt-Aufwand · `@name` = Zuständigkeit · `%%` = Kommentar. + +## Nutzung + +`frontend/index.html` im Browser öffnen — links Text bearbeiten, rechts entsteht das +Diagramm live. Toggles: transponierte (schmale) Darstellung, verworfene +Elemente einblenden. + +## Projektdokumente + +- `frontend/` — Editor · `backend/` — Kotlin/Spring (Gerüst folgt, siehe backend/README.md) +- `docs/SPEC.md` — verbindliche Sprachdefinition +- `docs/DECISIONS.md` — Design-Entscheidungen mit Begründung +- `docs/ROADMAP.md` — Mermaid-Plugin, Taiga-Integration, Tenzu +- `docs/TASKS.md` — offene Aufgaben (Checkboxen) +- `docs/brand/BRAND.md` — Logo, Wortbild, Anwendungsregeln +- `docs/design/` — Design-Herleitung der Marke +- `CLAUDE.md` — Projektkontext für Claude Code diff --git a/backend/CLAUDE.md b/backend/CLAUDE.md new file mode 100644 index 0000000..e406f01 --- /dev/null +++ b/backend/CLAUDE.md @@ -0,0 +1,26 @@ +# Werkbaum · Backend + +Kotlin/Spring-Boot-Anwendung. Aufgaben: Persistenz der Notationstexte, +Taiga-Integration (REST-API, `#ref`-Auflösung, Status-Sync), später +Tenzu-Adapter. Noch nicht bootstrapped — siehe README.md hier. + +## Konventionen +- Kotlin, Spring Boot, Gradle (Kotlin DSL), JDK 21. +- Paketwurzel `de.werkbaum`; Schichten: `api` (Controller/DTOs), + `domain`, `integration.taiga` (Client, Mapping), `persistence`. +- Tests mit JUnit 5 + Kotest-Assertions; Taiga-Client gegen + aufgezeichnete Antworten (WireMock), nie gegen Live-Instanzen. +- Konfiguration über `application.yml` + Umgebungsvariablen; + keine Zugangsdaten im Repository. + +## Wichtig (D14 — Parser-Hoheit) +Das Backend parst die Notation **nicht**. Es speichert den Text als Ganzes +und arbeitet mit expliziten Metadaten. Sollte Backend-Parsen doch nötig +werden: zuerst DECISIONS ergänzen, dann gegen die gemeinsamen Fixtures aus +docs/SPEC.md §10 testen — niemals eine zweite, abweichende Grammatik pflegen. + +## Taiga-Mapping (Vorgabe aus docs/ROADMAP.md) +- `#123` referenziert Epic/User Story/Task/Issue; Auflösung liefert Titel, + URL, Status. Status-Mapping Taiga-Workflow → Notation konfigurierbar + (Default: „New"→`[ ]`, „In progress"→`[~]`, „Ready for test"→`[/]`, + „Done"→`[x]`, „Archived"→`[^]`). diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..dda8911 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,9 @@ +# Werkbaum Backend + +Noch nicht bootstrapped. Vorgesehener Weg: + +1. Gerüst über https://start.spring.io erzeugen: Kotlin · Gradle (Kotlin DSL) · + JDK 21 · Abhängigkeiten: Spring Web, Spring Data JPA, Validation. +2. Inhalt dieses Ordners (CLAUDE.md, README.md) beibehalten, Gerüst + hineinlegen, Paketwurzel `de.werkbaum`. +3. Konventionen: siehe CLAUDE.md in diesem Ordner. diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md new file mode 100644 index 0000000..dcfa368 --- /dev/null +++ b/docs/DECISIONS.md @@ -0,0 +1,85 @@ +# Entscheidungen (ADR-Kurzform) + +Festgehaltene Design-Entscheidungen samt Begründung. Bei Änderungen: Eintrag +ergänzen, nicht löschen. + +## D1 — `|` für Oder-Zerlegung, `-` für Und-Zerlegung +`|` bedeutet in Regex und BNF-Grammatiken bereits „oder“ und ist damit +selbsterklärend. `-` ist das gewohnte Markdown-Listenzeichen für „normale“ +Teilpakete. Das Gate steckt im Aufzählungszeichen der Kinder, nicht in einer +Annotation am Parent — lokal lesbar, trivial parsebar. + +## D2 — Status als erweiterte Markdown-Task-Checkbox +GitHub-Markdown kennt `[ ]`/`[x]`; die Erweiterung auf `[?] [~] [/] [^] [-]` +wirkt sofort vertraut. Mnemonik: `?` vage, leeres Kästchen = todo, `~` gängige +In-progress-Konvention, `/` = halbes `x`, `x` = erledigt, `^` = „nach oben +deployed“, `-` = durchgestrichen. + +## D3 — Begriff „Durchstich“ für den Zwischenstatus +Zustand zwischen „in Arbeit“ und „fertig“: durchgängig funktionsfähig und +vorführbar, Feinarbeiten offen. „Durchstich“ ist als Fachbegriff (Tunnelbau, +End-to-End-Slice in der Softwarearchitektur) etabliert. Verworfene +Alternativen: „Feinschliff“, „Richtfest“, „vorführbereit“, „Beta“. + +## D4 — Begriff „verworfen“ statt „gestrichen“ +Beschreibt die bewusste Entscheidung gegen eine Option — besonders passend +für Any-of-Alternativen. Default ausgeblendet, Toggle „verworfene einblenden“. + +## D5 — Farb-Logik folgt dem Risiko, nicht dem Fortschritt +Rosé = Kosten investiert, Risiko hoch (in Arbeit). Pastellgelb = läuft, +Restrisiko klein (Durchstich). Flieder = geplant (Absicht, nichts investiert, +zwischen Grau der Idee und Rosé der Arbeit). Ergebnis-Skala: +grau → flieder → rosé → gelb → grün → blau. + +## D6 — Größe in Klammern, URL nackt, Personen mit `@` +`(M)` liest sich wie ein Kleidungsetikett. URLs werden ohne Link-Syntax +erkannt (einfach einfügbar); die URL wird **vor** den `@`-Tags extrahiert, +damit `https://user@host/…` nicht kollidiert. `@` ist die universelle +Mention-Konvention (GitHub, Slack, Jira). + +## D7 — `%%` als Kommentarzeichen +Mermaid-Konvention; hält den Weg zum Mermaid-Plugin frei. `//` scheidet wegen +URLs aus, `#` bleibt für Referenzen/Tags reserviert, `` ist zu sperrig. + +## D8 — Untergliederungspflicht ab M sichtbar machen +Fehlende Zerlegung wird nicht nur gemeldet, sondern **gezeigt**: Geister-Knoten +„Untergliederung fehlt“ hängt genau dort, wo der Ast weitergehen müsste. +Verworfene Elemente sind ausgenommen. Werden alle Kinder eines M+-Elements +verworfen und ausgeblendet, erscheint der Platzhalter wieder (es braucht eine +neue Zerlegung) — gewollt. + +## D9 — Transponierte Darstellung mit unterschiedlichen Austrittsseiten +Im vertikalen Modus tritt all of **rechts** aus dem Parent aus (LR-Baum), +any of **unten links**. Austrittsseite + Linienstil (durchgezogen/gestrichelt) +codieren das Gate doppelt; Beschriftungen werden nie rotiert. + +## D10 — Abzweige zielen auf Knotenmitte, nicht Teilbaummitte +Feste Knoten-Zeilenhöhe macht die Anschlusshöhe deterministisch (23 px). +Behebt „ins Leere laufende“ Linien bei eingerückten Unterbäumen. + +## D11 — Technologie: Vanilla HTML/CSS/JS, eine Datei als Prototyp +Keine Frameworks, kein Build-Zwang. Parser ~30 Zeilen, Renderer erzeugt +verschachtelte `ul.and`/`ul.or`; Linien via CSS-Pseudo-Elemente. Modularisierung +(Parser/Renderer/UI getrennt + Tests) ist der geplante nächste Schritt. + +## D12 — Name „Werkbaum" und Marke aus der Notation +Name: „Werk" + „Baum" = wörtlich der WBS-Baum; funktioniert als npm-Paket, +CLI-Befehl und Mermaid-Schlüsselwort (`werkbaum`, kleingeschrieben in +Code-Kontexten). Verworfene Kandidaten: Astrein, undoder, Aufriss, Gabelung. +Marke: Miniatur des Diagramms (K2) in zwei Orientierungen analog zu den +Darstellungsmodi — Hochformat als Primärzeichen, transponiert als +Sekundärzeichen. Nur Tinte + Petrol; durchgezogen = und, gestrichelt = oder; +Pastelltöne bleiben Statusfarben. Details: brand/BRAND.md. + +## D13 — Backend in Kotlin/Spring Boot, Monorepo-Struktur +Backend als Kotlin/Spring-Boot-Anwendung (Gradle Kotlin DSL, JDK 21), +entwickelt in IntelliJ IDEA Ultimate. Monorepo mit `frontend/` und `backend/`; +CLAUDE.md dreistufig: Wurzel für Querschnitt, je eine pro Teilprojekt +(wird von Claude Code pfadbezogen geladen). Kein Node- oder Python-Backend. + +## D14 — Parser-Hoheit liegt beim Frontend, SPEC ist normativ +Der Notationstext ist das führende Datenformat. Das Backend parst die +Notation nicht; es speichert den Text als Ganzes und bedient Integrationen +über explizite Metadaten. Wird Backend-Parsen später doch erforderlich, +gilt: docs/SPEC.md ist normativ, beide Parser testen gegen dieselben +Fixtures (SPEC §10) — es darf keine zweite, abweichende Grammatik entstehen. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md new file mode 100644 index 0000000..e2c74b4 --- /dev/null +++ b/docs/ROADMAP.md @@ -0,0 +1,52 @@ +# 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. + +## Kleinere Ideen +- Deterministische Pastellfarbe pro `@name` (Personen wiedererkennen). +- SVG/PNG-Export für Präsentationen. +- Sichtbare Anmerkungen am Knoten (eigene Syntax, getrennt von `%%`). +- Aufwands-Rollup: Größen der Kinder aggregieren und mit Parent vergleichen. +- Attribut-Syntax für Termine/Meilensteine. diff --git a/docs/SPEC.md b/docs/SPEC.md new file mode 100644 index 0000000..fc4fde7 --- /dev/null +++ b/docs/SPEC.md @@ -0,0 +1,140 @@ +# WBS-Notation – Spezifikation + +Textuelle Notation für Projektstrukturpläne (Work Breakdown Structure) mit +Und/Oder-Zerlegung. Diese Datei ist die verbindliche Sprachdefinition. +Syntaxänderungen werden zuerst hier dokumentiert, dann implementiert. + +## 1. Zeilenformat + +``` +[Einrückung][Zeichen] [Statusbox] Label (Größe) URL @tag … %% Kommentar +``` + +Alle Bestandteile außer dem Label sind optional. Die Extraktion erfolgt in +dieser Reihenfolge (wichtig für Kollisionsfreiheit): + +1. Kommentar entfernen: alles ab `%%` bis Zeilenende. +2. Einrückung, Zeichen (`-` / `|`) und Statusbox `[…]` per Zeilen-Regex. +3. URL: erstes Token, das auf `https?://\S+` passt (dadurch stören `@` in URLs nicht). +4. Größe: erstes `(XS|S|M|L|XL|XXL)`, Groß-/Kleinschreibung egal. +5. Tags: alle `@name`-Vorkommen. +6. Rest, whitespace-normalisiert = Label. Leeres Label ⇒ Zeile ignorieren. + +Referenz-Regex der Implementierung: + +``` +^([ \t]*)([-|])?\s*(?:\[([ ?~xX^/-])\]\s*)?(.*)$ +``` + +## 2. Hierarchie + +- Die Einrückung bestimmt die Ebene. Es gibt keine feste Schrittweite: + Elternknoten ist die nächste vorangehende Zeile mit **kleinerer** + Einrückungsbreite (Tab zählt als 2 Leerzeichen). +- Zeilen ohne Zeichen (`-`/`|`) sind Wurzelknoten. Mehrere Wurzeln = mehrere + Bäume nebeneinander. + +## 3. Zerlegungsart (Gate) + +| Zeichen | Bedeutung | Semantik | +|---|---|---| +| `-` | all of (Und-Zerlegung) | Alle Teilpakete sind erforderlich. | +| `\|` | any of (Oder-Zerlegung) | Mindestens eine Alternative wird gewählt. | + +- Das Gate ist eine Eigenschaft der Geschwistergruppe; alle Geschwister sollen + dasselbe Zeichen tragen. +- Gemischte Geschwister: Darstellung nach dem **ersten** Kind, plus Warnung + mit Zeilennummer. + +## 4. Status + +Codiert als Checkbox nach dem Zeichen (Erweiterung der Markdown-Task-Syntax): + +| Code | Key | Name | Bedeutung | Hintergrund | Rahmen | +|---|---|---|---|---|---| +| `[?]` | idee | Idee | vage Idee | `#EBEDEF` (grau) | `#A2ABB5` | +| `[ ]` | geplant | geplant | beschlossen, nichts investiert | `#EBE4F6` (flieder) | `#A991D4` | +| `[~]` | arbeit | in Arbeit | Kosten investiert, Risiko hoch | `#FADDE4` (rosé) | `#D897A8` | +| `[/]` | durchstich | Durchstich | funktionsbereit/vorführbar, Feinarbeiten offen | `#FBF2CE` (pastellgelb) | `#D9BE63` | +| `[x]` | fertig | fertig | abgeschlossen | `#DCF1DE` (pastellgrün) | `#86C293` | +| `[^]` | prod | in Produktion | deployed/live | `#DBEAF8` (pastellblau) | `#85ACD7` | +| `[-]` | verworfen | verworfen | bewusst nicht weiterverfolgt | `#F1F2F4`, gestrichelter Rahmen, Text durchgestrichen | `#B3BAC2` | + +- Ohne Statusbox: neutraler Knoten (weiß). +- `x` auch als `X` zulässig. +- Verworfene Knoten (inkl. Teilbaum) sind per Default **ausgeblendet**; + Toggle „verworfene einblenden“ zeigt sie. + +## 5. Aufwand (T-Shirt-Größen) + +- Werte: `XS < S < M < L < XL < XXL`, notiert in Klammern, z. B. `(L)`. +- **Untergliederungsregel:** Ab `(M)` muss ein Element weiter zerlegt sein. + Ein Element ≥ M **ohne Kinder** erhält: + - gestrichelte orange Umrandung (`--warn`, `#B45309`) und + - einen Geister-Knoten „Untergliederung fehlt“ an gestrichelter Linie darunter. +- Ausnahme: verworfene Elemente lösen die Regel nie aus. +- Anzeige: dunkles Badge oben rechts an der Knoten-Ecke. + +## 6. Links + +- Ein nacktes `https://…`-Token macht den ganzen Knoten klickbar + (neuer Tab, `rel="noopener"`); Kennzeichnung mit ↗ hinter dem Label. + +## 7. Personen-Tags + +- `@name` mit `name` aus Unicode-Buchstaben, Ziffern, `.`, `_`, `-`. +- Mehrere Tags pro Zeile möglich, Position im Text egal. +- Anzeige: helle Pillen unten rechts an der Knoten-Ecke. + +## 8. Kommentare + +- `%%` leitet einen Kommentar ein — ganze Zeile oder ab Zeilenmitte. +- Konvention aus Mermaid übernommen; `%%{` vermeiden (dort Direktiven-Syntax). + +## 9. Darstellung + +### Normalmodus +- **all of:** Kinder nebeneinander, klassischer Organigramm-Fächer, + durchgezogene Linien (Tinte `#41556E`). +- **any of:** Alternativen untereinander; durchgezogene vertikale Linie links + unterhalb des Parents, **gestrichelte** Abzweige zu den Alternativen + (Petrol `#0F766E`). Alternative-Knoten mit petrolfarbenem Rahmen. + +### Transponierter Modus (Toggle „schmal (vertikal)“) +- **all of:** Linie tritt **rechts auf halber Höhe** aus dem Parent aus + (entspricht Richtung LR), vertikale Sammelleiste, durchgezogene Abzweige; + Kinder rechts eingerückt untereinander. +- **any of:** unverändert — Austritt **unten links**, gestrichelte Abzweige. +- Merkregel: Austrittsseite codiert das Gate (rechts = und, unten = oder), + Linienstil bestätigt es. + +### Geometrie-Invarianten +- Knoten haben feste Zeilenhöhe (`line-height: 1.3`), damit Abzweige + deterministisch auf Knotenmitte liegen (Offset 23 px = 5 px Listenabstand + + halbe Knotenhöhe). Abzweige zielen auf den **Knoten**, nie auf die Mitte + des Teilbaums. + +## 10. Beispiel (kanonisch) + +``` +%% Projektstruktur – Stand Sprint 14 +[~] Website-Relaunch (XL) https://wiki.example.de/relaunch + - [x] Konzeption (M) + - [x] Zielgruppenanalyse (S) + - [x] Sitemap (XS) + - [~] Umsetzung (XL) + - [/] Frontend (S) https://git.example.de/frontend @anna + - [ ] Backend (L) @ben @carla + - [ ] CMS-Anbindung (M) + | [ ] WordPress + | [?] Headless CMS + | [-] Eigenentwicklung %% Aufwand zu hoch + - [?] Hosting (M) + | Cloud + | On-Premise +``` + +## 11. Reservierte Erweiterungen (noch nicht implementiert) + +- `#123` — Referenz auf externe Tickets (geplant für Taiga-Integration). +- `#tag` — freie Schlagworte (deshalb `#` nicht anderweitig verwenden). diff --git a/docs/TASKS.md b/docs/TASKS.md new file mode 100644 index 0000000..b56135f --- /dev/null +++ b/docs/TASKS.md @@ -0,0 +1,29 @@ +# Aufgaben + +Abhaken beim Erledigen; neue Aufgaben unten anfügen. + +## Phase 1 — Modularisierung & Tests +- [ ] Projektgerüst: `src/` (parser.js, model.js, render.js, app.js), + `tests/`, `index.html` bindet Module ein; weiterhin ohne Build nutzbar + (ES-Module) oder mit minimalem Setup (Vite) — Entscheidung dokumentieren. +- [ ] Parser extrahieren; Verhalten exakt wie in `docs/SPEC.md` §1–§8. +- [ ] Unit-Tests für den Parser (Vitest): kanonisches Beispiel aus SPEC §10 + als Fixture; Randfälle: gemischte Gates, Tabs/ungleichmäßige Einrückung, + URL mit `@`, mehrere Wurzeln, leere Labels, `%%` am Zeilenanfang/-ende. +- [ ] Renderer extrahieren (HTML-String-Erzeugung), Snapshot-Tests für + Normal- und Vertikalmodus sowie „Untergliederung fehlt“. +- [ ] Warnungs-Modell vereinheitlichen (Zeilennummern, Typen). + +## Phase 2 — Qualität +- [ ] Barrierefreiheit: Fokusreihenfolge, aria-Labels für Status/Größe/Tags. +- [ ] Druck-Stylesheet (Diagramm ohne Editor-Panel). +- [ ] Fehlertolerantes Parsen weiter ausbauen (unbekannte Statuszeichen melden). + +## Phase 3 — Integrationen (siehe docs/ROADMAP.md) +- [ ] Backend-Gerüst per Spring Initializr in `backend/` anlegen + (Kotlin, Gradle Kotlin DSL, JDK 21; Konventionen: backend/CLAUDE.md). +- [ ] SVG-Renderer (Layout-Engine) als gemeinsame Basis für Export und + Mermaid-Plugin. +- [ ] Mermaid-Plugin-Spike: Detektor + Registrierung, ein Minimalbaum. +- [ ] Taiga-Spike: `#ref`-Syntax parsen, Status via REST-API auflösen + (read-only), Mapping konfigurierbar. diff --git a/docs/brand/BRAND.md b/docs/brand/BRAND.md new file mode 100644 index 0000000..a62cd55 --- /dev/null +++ b/docs/brand/BRAND.md @@ -0,0 +1,39 @@ +# Werkbaum — Marke + +Leitidee: Die Marke ist aus den Strichen der Notation gebaut — +**durchgezogen = und**, **gestrichelt = oder**. Das Zeichen ist eine Miniatur +des Diagramms; es existiert in zwei Orientierungen, analog zu den beiden +Darstellungsmodi des Produkts. + +## Dateien (`brand/`) + +| Datei | Zweck | +|---|---| +| `logo.svg` | Primärzeichen, Hochformat (Variante A), helle Flächen | +| `logo-dark.svg` | Primärzeichen für dunkle Flächen | +| `logo-quer.svg` | Sekundärzeichen, transponiert (Variante B), für breite/niedrige Flächen (Header-Leisten, Banner) | +| `logo-quer-dark.svg` | Sekundärzeichen für dunkle Flächen | +| `favicon.svg` | vereinfachte Zwei-Ebenen-Form für 16–32 px | + +Design-Herleitung und Alternativen: `docs/design/logo-konzepte.html` und +`docs/design/logo-k2-varianten.html`. + +## Farben + +- Tinte `#243447`, Petrol `#0F766E` (Oder-Anteile). +- Auf dunklem Grund: Papier `#F3F6F9`, Petrol hell `#45C4B4`. +- Die Pastelltöne des Produkts sind **Statusfarben** und erscheinen nie im Logo. +- Einfarbige Variante: alles in Tinte; die Strichelung bleibt erhalten. + +## Wortbild + +- IBM Plex Sans SemiBold, Zweiteilung: **Werk** (Tinte) + **baum** (Petrol), + letter-spacing −0.02em. +- CLI/npm/Code-Kontexte: konsequent kleingeschrieben `werkbaum` + (IBM Plex Mono). + +## Regeln + +- Gestrichelte Anteile behalten Richtung und Strichmuster; nichts rotieren. +- Unter 24 px immer `favicon.svg` verwenden, nie das Primärzeichen verkleinern. +- Schutzraum: mindestens die Höhe des Wurzel-Kästchens rundum. diff --git a/docs/brand/favicon.svg b/docs/brand/favicon.svg new file mode 100644 index 0000000..5639937 --- /dev/null +++ b/docs/brand/favicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/brand/logo-dark.svg b/docs/brand/logo-dark.svg new file mode 100644 index 0000000..14fcf3a --- /dev/null +++ b/docs/brand/logo-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/brand/logo-quer-dark.svg b/docs/brand/logo-quer-dark.svg new file mode 100644 index 0000000..ae84fee --- /dev/null +++ b/docs/brand/logo-quer-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/brand/logo-quer.svg b/docs/brand/logo-quer.svg new file mode 100644 index 0000000..bee3c95 --- /dev/null +++ b/docs/brand/logo-quer.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/brand/logo.svg b/docs/brand/logo.svg new file mode 100644 index 0000000..2f292dc --- /dev/null +++ b/docs/brand/logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/design/logo-k2-varianten.html b/docs/design/logo-k2-varianten.html new file mode 100644 index 0000000..f492dc2 --- /dev/null +++ b/docs/design/logo-k2-varianten.html @@ -0,0 +1,213 @@ + + + + + +Werkbaum · K2 „Die Miniatur" — zwei Varianten + + + + +
+ +
+ Markenentwurf · K2 ausgearbeitet +

Die Miniatur — zwei Varianten

+

Beide Varianten zeigen denselben Baum: gefüllte Wurzel, Und-Fächer mit + durchgezogenen Linien, ein Oder-Anschluss gestrichelt in Petrol. Sie + entsprechen den zwei Darstellungsmodi des Produkts — Hochformat wie + die normale Ansicht, Querformat wie die transponierte.

+
+ +
+

Variante A · Hochformat

Primärzeichen
+
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+
+ + + + + + + + +
+
+ + + + + + +
+ 32 / 16 px +
+
+ + + + + + + + + Werkbaum +
+
+

Drei Ebenen erzählen die ganze Geschichte: Wurzel, Und-Fächer, und aus dem + rechten Paket hängt gestrichelt eine Alternative. Einsatz: Website, + Doku-Titel, App-Icon, README. Für 16 px die vereinfachte Form — zwei Ebenen, + der Oder-Anteil wandert als petrolfarbener Rahmen ins rechte Kind.

+
+ +
+

Variante B · Transponiert

Sekundärzeichen für breite Flächen
+
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+
+ + + + + + + + +
+
+ + + + + + +
+ 32 / 16 px +
+
+ + + + + + + + + Werkbaum +
+
+

Die Wurzel links, die Struktur wächst nach rechts — exakt die Logik des + transponierten Modus: die Und-Linie tritt rechts aus der Wurzel aus, + der Oder-Zweig hängt gestrichelt unten an der Sammelleiste. + Einsatz: breite Flächen wie Header-Leisten, Social-Banner, + Doku-Fußzeilen — überall dort, wo das Hochformat zu viel Höhe bräuchte.

+
+ +
+ + diff --git a/docs/design/logo-konzepte.html b/docs/design/logo-konzepte.html new file mode 100644 index 0000000..1ea1244 --- /dev/null +++ b/docs/design/logo-konzepte.html @@ -0,0 +1,317 @@ + + + + + +Werkbaum · Logo & Wortbild + + + + +
+ +
+ Markenentwurf +

Werkbaum — Logo & Wortbild

+

Leitidee: Die Marke wird aus den Strichen der Notation selbst gebaut — + durchgezogen = und, gestrichelt = oder. + Wer das Diagramm kennt, liest das Logo; wer das Logo kennt, versteht das Diagramm.

+
+ +
+

Bildmarken

+
+ +
+ Empfehlung +
+
+ + + + + +
+
+ + + + + +
+
+
+ + + + + +
+
+ + + + + +
+ 32 / 16 px +
+
+

K1 · Die Gabelung

+

Wurzelpunkt, Stamm, eine Und-Gabel, ein Oder-Zweig — die ganze Notation + in einer Geste. Skaliert bis zum Favicon, funktioniert einfarbig + und ist als App-Kachel sofort erkennbar.

+
+ +
+
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+
+ + + + + + + + +
+
+ + + + + + +
+ 32 / 16 px +
+
+

K2 · Die Miniatur

+

Der Projektstrukturplan selbst als Zeichen: gefüllte Wurzel, Und-Fächer, + gestrichelter Oder-Anschluss. Am erklärendsten — ideal für + Website-Header und Doku; fürs Favicon braucht es die vereinfachte Form.

+
+ +
+
+
+ + + + + + +
+
+ + + + + + +
+
+
+ + + + + + +
+
+ + + + + +
+ 32 / 16 px +
+
+

K3 · Der Spross

+

Aus der Status-Checkbox [/] (Durchstich) wächst ein Zweig — Und + solid, Oder gestrichelt. Erzählt die Herkunft aus der Markdown-Task-Welt; + der verspielteste der drei Entwürfe.

+
+ +
+
+ +
+

Wortbild

+
+ +
+ Primär-Lockup +
+ + + + + + Werkbaum +
+
+ +
+ Auf Tinte +
+ + + + + + Werkbaum +
+
+ +
+ CLI / npm +
$ [/] werkbaum render projekt.wbs
+
+ +
+
+ +
+

Anwendungsregeln

+
+ Die Marke nutzt genau zwei Farben: Tinte #243447 und Petrol #0F766E + (auf dunklem Grund #F3F6F9 und #45C4B4). Die Pastelltöne bleiben ausschließlich + Statusfarben im Produkt und erscheinen nie im Logo — so bleibt die Marke + ruhig und die Status-Semantik eindeutig. Der gestrichelte Zweig zeigt immer nach + rechts unten und behält sein Strichmuster; einfarbige Variante: alles in Tinte, + Strichelung bleibt. Wortbild in IBM Plex Sans SemiBold mit der Zweiteilung + Werk / baum; für CLI, npm und + Code-Kontexte konsequent kleingeschrieben: werkbaum. +
+
+ +
+ + diff --git a/frontend/CLAUDE.md b/frontend/CLAUDE.md new file mode 100644 index 0000000..7b987ee --- /dev/null +++ b/frontend/CLAUDE.md @@ -0,0 +1,21 @@ +# Werkbaum · Frontend + +Editor: `index.html` ist der funktionierende Prototyp (Text links, +Diagramm rechts, Toggles für transponierte Ansicht und verworfene Elemente). + +## Konventionen +- Vanilla HTML/CSS/JS, ES-Module; keine Frameworks. Testwerkzeug (Vitest) ok. +- Parser und Renderer müssen headless (ohne Editor-UI) nutzbar bleiben — + Basis für SVG-Export und Mermaid-Plugin (docs/ROADMAP.md). +- Design: Farben/Typografie beibehalten (CSS-Variablen, IBM Plex); + Statusfarben sind in SPEC §4 normiert. Marke nach ../brand/BRAND.md; + Pastelltöne nie im Logo. + +## Stolperfallen +- Abzweig-Linien zielen auf die **Knotenmitte** (fester 23-px-Offset, + `line-height: 1.3`), nicht auf die Mitte des Teilbaums — bei Layout- + Änderungen beide Modi (normal + „schmal (vertikal)") prüfen. +- Extraktionsreihenfolge im Parser nicht umstellen: Kommentar → Zeichen/ + Status → URL → Größe → Tags (sonst kollidiert `@` in URLs). +- „verworfen" ist per Default ausgeblendet; Filterlogik steckt in + `visibleChildren()` und muss bei Renderer-Umbauten erhalten bleiben. diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..158da46 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,494 @@ + + + + + +Werkbaum · WBS-Editor + + + + + + +
+

+ + Werkbaum +

+

Links die textuelle Struktur bearbeiten — rechts entsteht das Diagramm live.

+
+ +
+
+
Struktur (Text)
+ +
+ Einrückung (2 Leerzeichen oder Tab) definiert die Hierarchie.
+ -  Teilpaket, alle erforderlich (all of)
+ |  Alternative, eine wählen (any of)
+ Zeile ohne Zeichen = Wurzelknoten. Geschwister sollten dasselbe Zeichen tragen.
+ Status als Kästchen nach dem Zeichen, z. B. - [~] Frontend: +
+ [?] Idee + [ ] geplant + [~] in Arbeit + [/] Durchstich + [x] fertig + [^] in Produktion + [-] verworfen +
+ Aufwand als T-Shirt-Größe in Klammern, Link einfach als URL anhängen:
+ - [ ] Backend (L) https://…
+ Ab (M) gilt: weiter untergliedern — fehlt die Untergliederung, erscheint ein Platzhalter im Diagramm.
+ Kommentare mit %% — als ganze Zeile oder am Zeilenende. + Personen mit @name — erscheinen unten rechts am Knoten. +
+
+ +
+
+ Diagramm + + +
+
    +
    +
    +
    + + + + +