MindSift CI & Docker Release / Build, Test in Container & Push (push) Failing after 29s
93 lines
5.3 KiB
Markdown
93 lines
5.3 KiB
Markdown
# 📝 Kernmodul 3: Workspace Outliner-Engine, Wiki-Links & Pure-DB Storage
|
|
|
|
Der MindSift Workspace ([`WorkspaceView.tsx`](../../frontend/src/features/workspace/WorkspaceView.tsx)) kombiniert ein **hierarchisches Bullet-Point Notizsystem (inspiriert von Logseq)** mit einem **persönlichen Wiki** und einem **globalen To-Do Rollup Dashboard**.
|
|
|
|
---
|
|
|
|
## 🌳 1. Die Logseq-Outliner-Engine
|
|
|
|
Im Gegensatz zu klassischen Fließtext-Editoren basiert der MindSift Workspace auf **Blöcken** (`document_blocks` in SQLite). Jeder Block ist ein gedanklicher Knotenpunkt mit einer flexiblen Einrückungsebene (`level: 0, 1, 2, ...`).
|
|
|
|
```
|
|
• Projekt MindSift v2.0 (level 0)
|
|
• Architektur-Entscheidung (level 1)
|
|
- [x] Database-First Blocks implementieren (level 2)
|
|
- [ ] Performance Benchmark mit 10.000 Blöcken (level 2)
|
|
• Notizen aus dem Dev-Meeting (level 1)
|
|
> Wichtig: Keine verschachtelten SQLite Queries ausführen! (level 2)
|
|
```
|
|
|
|
### Tastatur-Navigation & Shortcuts
|
|
- `Enter`: Erstellt einen neuen Block auf derselben Hierarchieebene.
|
|
- `Tab`: Rückt den aktuellen Block ein (wird Kindknoten des vorherigen Blocks).
|
|
- `Shift + Tab`: Rückt den Block um eine Ebene aus (verringert die Tiefe).
|
|
- `Shift + Enter`: Weicher Zeilenumbruch innerhalb desselben Blocks (z.B. für mehrzeilige Notizen oder Code).
|
|
- `Backspace` (auf leerem Block): Rückt den Block aus oder löscht ihn, wenn er auf Level 0 ist.
|
|
- `/` (Slash-Commands): Öffnet das Umwandlungsmenü (`/todo`, `/h1`, `/h2`, `/h3`, `/code`, `/callout`, `/quote`, `/divider`).
|
|
|
|
### Zoom-In Hoisting (Fokus-Modus)
|
|
Klickt der Benutzer auf den Bullet-Dot (`•`) eines Blocks, blendet der Editor alle übergeordneten und benachbarten Blöcke aus und zoomt **ausschließlich in diesen Ast** hinein.
|
|
- Eine dezente Breadcrumb-Leiste oben zeigt den Pfad an (z.B. `Workspace / Projekte / MindSift / Architektur`).
|
|
- Ein Klick auf ein beliebiges Breadcrumb-Element zoomt sofort auf die jeweilige Ebene zurück.
|
|
|
|
### Drag & Drop von Blöcken
|
|
Der Bullet-Dot dient gleichzeitig als Drag-Anfasser. Wird ein Block verschoben, erkennt die Engine automatisch alle untergeordneten Kind-Blöcke (`isDescendantBlock`) und verschiebt den **kompletten Unterbaum** an die neue Zielposition.
|
|
|
|
---
|
|
|
|
## 🔗 2. Wiki-Links (`[[Link]]`) & Hashtags
|
|
|
|
1. **Interne Wiki-Links:**
|
|
- Text in doppelten eckigen Klammern (z.B. `[[Reiseplanung 2026]]`) wird automatisch als klickbarer Link gerendert.
|
|
- Ein Klick darauf durchsucht die Notizen des Benutzers und öffnet das Ziel-Dokument direkt im Editor.
|
|
2. **Hashtags (`#tag`):**
|
|
- Hashtags im Fließtext werden automatisch indiziert (`doc_block_tags`-Tabelle).
|
|
- In der linken Leiste listet der Tag-Explorer alle verwendeten Schlagworte auf. Klick auf ein Tag filtert alle Dokumente und Blöcke, die dieses Tag enthalten.
|
|
|
|
---
|
|
|
|
---
|
|
|
|
## ⚡ 3. Yjs CRDT Real-Time Engine & Dual-Persistence
|
|
|
|
Ab MindSift v2.1 setzt der Workspace auf ein **konfliktfreies Replicated Data Type (CRDT) Modell** auf Basis von [Yjs](https://yjs.dev/):
|
|
|
|
### Funktionsweise
|
|
1. **CRDT-Struktur im Client:**
|
|
- Ein `Y.Doc` pro geöffnetem Dokument.
|
|
- `Y.Array<string>` (`blocks`): Führt die Block-IDs in korrekter Reihenfolge. Der YATA-Algorithmus garantiert, dass simultanes Einfügen, Verschieben oder Löschen von Blöcken durch mehrere Nutzer deterministisch und konfliktfrei konvergiert.
|
|
- `Y.Map` (`block:<id>`): Speichert Inhalt (`content`), Einrückung (`level`), Erledigungsstatus (`checked`) und Faltungsstatus (`collapsed`).
|
|
2. **Kollaborative Bearbeitung ohne Sperren:**
|
|
- Nutzer können simultan dieselbe Notiz bearbeiten.
|
|
- Fokus- und Cursor-Positionen werden via `CRDT_AWARENESS` übertragen und als farbige Benutzer-Pillen direkt am jeweiligen Block visualisiert.
|
|
|
|
### Dual-Persistence in SQLite
|
|
```
|
|
Client (Y.Doc Mutation)
|
|
│
|
|
├──▶ WebSocket (CRDT_UPDATE Base64 Delta)
|
|
│ │
|
|
│ ▼
|
|
│ SQLite: document_crdt_updates / document_crdt_state
|
|
│ (Mathematisch exakte CRDT-Konvergenz)
|
|
│
|
|
└──▶ Periodischer Snapshot / Flush
|
|
│
|
|
▼
|
|
SQLite: document_blocks
|
|
(Relationale Indizes für Global To-Dos, Tag-Explorer & FTS)
|
|
```
|
|
|
|
1. **Mathematische CRDT-Garantie:** Binäre Yjs-Updates werden in `document_crdt_updates` und periodisch als Snapshot in `document_crdt_state` gesichert. Auch nach einem Server-Neustart oder Offline-Phasen konvergieren alle Clients verlustfrei.
|
|
2. **Relationale Query-Fähigkeit:** Um schnelle SQL-Abfragen für das globale To-Do Rollup Dashboard und Hashtags zu ermöglichen, werden die Blöcke parallel in `document_blocks` materialisiert. Es existieren **keine Markdown-Dateien auf der Festplatte**.
|
|
|
|
---
|
|
|
|
## 📊 4. Globaler To-Do Rollup Dashboard
|
|
|
|
Über den Tab **„Globale To-Dos"** bietet der Workspace eine aggregierte Übersicht aller im gesamten Wiki verteilten Aufgaben:
|
|
- Scannt in Echtzeit alle unvollendeten `- [ ] ` Checkboxen über alle Ordner und Notizen hinweg.
|
|
- Übersichtliche Gruppierung nach **Ordner ➔ Dokument ➔ Aufgabe**.
|
|
- **Ordner-Filter:** Klick auf einen Ordner isoliert nur dessen Aufgaben für fokussiertes Arbeiten.
|
|
- **2-Wege-Live-Sync:** Wird eine Checkbox im Rollup abgehakt, wird der Block in SQLite sofort auf `checked = 1` aktualisiert und via WebSocket an alle aktiven Clients gebroadcastet.
|