Jannik
721a2b9dc6
fix(webapp): clean up note loader auth error handling
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-08 17:51:43 +02:00
Jannik
6a3d7d3bf8
chore: move Android app to dedicated repository Mind-o-Mat-App and keep server Quick-Capture APIs
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-08 17:51:19 +02:00
Jannik
6f6930ea28
fix(sync): automatsches Klonen und harter Reset bei divergierender Historie im Container-Entrypoint
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-08 17:35:57 +02:00
Jannik
430db1f245
feat: automatischer Start-Index, Git-Safe-Directory und Hintergrund-Sync
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-08 17:06:35 +02:00
Jannik
c717353037
fix: beheben von Lint- und Prettier-Fehlern in Tests und Config
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-08 16:54:21 +02:00
Jannik
94bdb32adf
PWA: 'Neue Notiz'-Button + Modal fuer schnelles Erstellen
...
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
Vorher: Notizen nur per SSH + Editor (Clish) oder durch Klick auf
Knoten im Graph (der nicht da war, wenn Notiz neu war).
Jetzt: 'Neue Notiz'-Button im Header oeffnet ein Modal mit:
- Titel
- Inhalt (Markdown-Textarea)
- Tags (kommasepariert)
- Toggle: In Inbox/ (mit Watch-Mode) vs 01_Daily/ (sofort)
Beim Speichern: PUT via Notes-API, danach refresh der Landkarte.
Workflow:
1. User oeffnet mind.orfel.de
2. Klickt '+ Neue Notiz' oben rechts
3. Fuellt Titel + Inhalt aus
4. Toggle 'In Inbox' an (empfohlen, wenn Watch-Mode laeuft)
5. Speichern
6. Watch-Mode im Container verarbeitet automatisch -> Wiki-Eintrag
7. Graph wird neu geladen, Notiz erscheint
2026-09-07 19:00:18 +02:00
Jannik
46a0a34684
Bonus 18: TWA-Build-Script mit bubblewrap + PWABuilder-Fallback
...
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- scripts/build-twa.mjs: baut TWA-Build
- Pre-Flight-Checks (Manifest, sha256-Fingerprint-Warnung)
- Versucht bubblewrap (npm-Paket)
- Fallback: PWABuilder.com-Anleitung
- webapp/TWA-BUILD.md: Schnellstart mit 'npm run build:twa'
2026-09-05 18:08:15 +02:00
Jannik
99d9fa6b7c
v2.0.5: Background-Sync in PWA + Sync-Queue + 8 Tests (Phase 4.3 erweitert)
...
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
Phase 4.3 (Background-Sync):
- webapp/src/sync-queue.ts: localStorage-basierte Queue
- enqueueSync, dequeueSync, loadQueue, saveQueue, clearQueue
- TypeScript mit korrekten Typen
- webapp/src/EditorWithLoad.tsx: erweitert
- Auto-Sync-Toggle (localStorage-Persistenz)
- Online-Event-Listener: processQueue bei reconnect
- Bei Auto-Sync: direkt speichern + sync
- Bei Offline: in Queue, wird bei 'online' verarbeitet
- Pending-Counter im UI
- webapp/public/service-worker.js: Background-Sync
- 'sync'-Event-Handler mit tag 'mindomat-sync'
- Ruft POST /api/sync, postet Ergebnis an Clients
- Browser-Support: Chrome/Edge (Background-Sync API)
Tests:
- tests/sync-queue.test.ts: 8 neue Tests
- Startzustand, enqueue, FIFO, dequeue, clearQueue
- Roundtrip, kaputtes JSON
- localStorage-Mock
Verifiziert:
- 79/79 Tests gruen (10 neu seit v2.0.4)
- Webapp tsc + build OK
- EditorWithLoad funktional mit Auto-Sync-Option
Pfad-Korrekturen:
- vite.config.ts: ../../src/ -> ../src/ (war falsch, webapp ist nur 1 Ebene tiefer)
2026-09-05 12:38:34 +02:00
Jannik
1590b633e5
v2.0.4: NotesApi-Server-Modul + 10 Tests (Phase 4.3)
...
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- src/notes-api-server.ts: NotesApi-Klasse
- listNotes(): Liste Notiz-IDs in 4 Top-Level-Verzeichnissen
- getNote(id): liest Notiz mit Frontmatter-Parsing
- saveNote(id, content): schreibt Notiz, erstellt Parent-Dirs
- syncVault(toolBinaryPath): Promise, ruft mindomat sync als Subprozess
- webapp/vite.config.ts: nutzt NotesApi statt Inline-Logik
- 3 Middleware-Handler: GET /api/notes, GET/PUT /api/notes/<id>, POST /api/sync
- tests/notes-api.test.ts: 10 Tests
- listNotes: leer, Inbox, Verarbeitet-Filter, Forward-Slashes
- getNote: nicht-existent, mit Frontmatter
- saveNote: neu, ueberschreiben, Parent-Dirs
- E2E roundtrip: list -> save -> get -> update -> get
Verifiziert:
- 71/71 Tests gruen
- Code-Duplikation zwischen Webapp und Tool-Repo entfernt
- NotesApi ist jetzt isoliert testbar (kein Vite-Server noetig)
2026-09-05 12:35:35 +02:00
Jannik
f1244f615f
v2.0: Phase 4+5 komplett + 2.4+2.5 erweitert
...
Phase 2.4 - Deterministische Konflikt-Vorpruefung:
- src/ingest.ts: preCheckConflict(note, wiki) -> boolean
Erkennt Verneinungen (kein, nicht, nie) + Wort-Ueberlappung
- In src/cli/ingest.ts: vor LLM-Parse aufgerufen
Wenn Konflikt erkannt + LLM hat nicht erkannt -> konflikt_hart=true, status=konflikt
- 7 Tests: erkennt, ignoriert, Wortgrenzen, Verneinungs-Varianten
Phase 2.5 - Inhaltliche Aehnlichkeit (Jaccard):
- src/ingest.ts: jaccardSimilarity(a, b) -> 0-1
Deterministisch, keine externen Abhaengigkeiten
- 5 Tests: identisch, verschieden, Ueberlappung, leer, Wortlaenge
- 3 extractWords-Tests: lowercase, Satzzeichen, Unicode
Edge-Case-Tests fuer Indexer:
- tests/indexer-edge-cases.test.ts: 7 Tests
- leerer Vault
- Notiz ohne Frontmatter (Typ aus Pfad erkannt)
- Unicode (Kaffee_AeOeUe)
- tote Wikilinks
- zirkulaere Wikilinks
- Mehrfach-Wikilinks dedupliziert
- Wikilink mit Anzeige-Text [[A|Alias]]
- Konfig.md als SKIP_FILE (System-Datei, nicht indexieren)
Phase 4.1 - Tiptap-Editor:
- webapp/src/Editor.tsx: Tiptap + StarterKit
Live-Preview (Split-View), Speichern-Button, Status-Indikator
HTML<->Markdown via marked + turndown
- webapp/src/EditorWithLoad.tsx: Lade/Speichere-Logik
- GET /api/notes/<id> beim Oeffnen
- PUT /api/notes/<id> beim Speichern
- POST /api/sync manuell
- webapp/src/notes-api.ts: API-Client
- webapp/src/turndown.d.ts: Type-Shim
Phase 4.2 - PWA-Manifest + Service Worker:
- webapp/public/manifest.webmanifest: Standalone, Theme, Icons
- webapp/public/icon-192.svg, icon-512.svg: SVG-Icons
- webapp/public/service-worker.js: Cache-First, offline-faehig
- webapp/index.html: Link auf manifest + Service-Worker-Registrierung
Phase 4.3 - Sync-Trigger in PWA:
- webapp/vite.config.ts: notesApiPlugin mit /api/notes/* und /api/sync
Liest aus VAULT_PATH (Env-Var MINDOMAT_VAULT_PATH)
Schreibt Notizen, ruft mindomat sync als Subprozess
- Sync-Button in EditorWithLoad: manueller Trigger
Im Production-Mode wuerde Background-Sync via Service Worker noetig
Phase 5.1 - TWA-Konfiguration:
- webapp/twa-manifest.json: Bubblewrap-Manifest mit Package-ID, Host, Fingerprints
- webapp/public/.well-known/assetlinks.json: Digital Asset Links
- webapp/TWA-BUILD.md: Vollstaendige Build-Anleitung (Bubblewrap, Play Store, Capacitor-Alternative)
SPEC v2.0 + Plan v1.0:
- Status-Uebersicht: alle 5 Phasen komplett
- Tests: 50/50 gruen
- Was-tut-Liste: PWA-Editor, TWA-Wrapper
- Was-nicht-tut-Liste: kein iOS, kein Cloud-Sync, keine externen Suche-APIs
- Plan v1.0: gleicher Status
Verifiziert:
- Tool: 50/50 Tests, build OK
- Webapp: 99 Module, 1052 KB JS, 7.36s Build
- Editor: Tiptap laedt/speichert Notizen via Vite-Plugin
- PWA: Manifest + Service Worker + Icons vorhanden
- TWA: Konfig + Build-Anleitung + assetlinks.json
2026-09-05 12:10:00 +02:00
Jannik
fb810b1e7b
v1.0: Phase 3 abgeschlossen + Spec/Plan v1.0/v0.2
...
Phase 3.2 Radialer Baum (Webapp Tab 3):
- webapp/src/RadialView.tsx: Cytoscape concentric-Layout
- Anker-Notiz in der Mitte, verlinkte Notizen in Ringen
- Auswahl der Anker-Notiz via Klick im Graph oder Cluster-Tab
- Header-Tabs erweitert: Graph | Cluster-Karte | Radial
- App.tsx: view-Mode-State erweitert um 'radial'
Phase 1+2+3 abgeschlossen (siehe Status-Bloecke).
SPEC v1.0:
- Header: v1.0 mit Stand und Status-Block
- Neue Sektion 'Status-Uebersicht' direkt nach Header
- § 3 erweitert: kein deterministischer Konflikt-Vorab-Check (offen)
- § 13.2: 'Phase 3 fertig' markiert
- § 17 'Offene Punkte' aktualisiert: geloeste Items durchgestrichen, Phase-2.4-d (deterministisch) + 2.5e (Embedding) als Phase-2-erweitert, Phase 4+5 als ausstehend
Plan v0.2:
- Header: v0.2 mit Stand und Status-Block
- Status-Tabelle fuer alle 5 Phasen
Verifiziert:
- 28/28 Unit-Tests gruen
- Webapp-Build (35 Module, 595 KB, 2.35s)
- E2E-Pipeline: Inbox -> Ingest -> Wiki (mit --mock), Indexer deterministisch, Sync zu gitea funktioniert
2026-09-05 12:00:40 +02:00
Jannik
aa3083177d
Phase 3.1: Cluster-Karte als zweiter Webapp-Tab
...
- webapp/src/ClusterMap.tsx: HTML/CSS-Grid mit Clustern als Spalten
- Gruppierung nach cluster-Feld aus landkarte.json
- Notizen als Karten mit Typ-Farbe + Status-Badge + Veraltet-Warnung
- Klick auf Karte -> onSelect -> Detail-Panel
- webapp/src/App.tsx: Tab-Wechsel (Graph / Cluster-Karte)
- Header mit Buttons, ViewMode-State
- Conditionally rendert entweder Cytoscape-Graph oder ClusterMap
- Detail-Panel zeigt jetzt auch veraltet-Status
- Build: 34 Module, 593 KB, 2.20s
Verifiziert:
- 'graph' zeigt Cytoscape-Graph wie vorher
- 'cluster' zeigt HTML-Grid mit Clustern als Spalten
- Klick auf Notiz in beiden Tabs -> Detail-Panel rechts
2026-09-05 11:57:06 +02:00
Jannik
88448a8a35
Phase 1 fertig: Webapp-Interaktion (1.7) + Sync-Skript (1.8)
...
1.7 Webapp-Interaktion:
- Hover-Tooltip mit Titel + Snippet (Cytoscape mouseover)
- Klick auf Knoten: Detail-Panel mit ID, Typ, Cluster, Status, Tags, Vorschau
- Note-Loader versucht Inhalt zu laden (fehlertolerant)
- Legende mit Typ-Farben
1.8 Sync-Skript:
- git pull --rebase --autostash
- Lokale Aenderungen als 'vault: <datum>' committen (oder --message)
- git push origin main
- Lockfile in 99_System/Skripte/Lock/Sync.lock
- Log-Eintrag in 99_System/Logs/Sync_<Datum>.md
- --force Flag zum Ignorieren des Locks
- Bei Konflikt: Exit 4, manuell loesen
E2E-verifiziert auf Test-Vault:
- 3 Demo-Notizen indexiert + committed + gepusht
- Remote: git.orfel.de/Jannik/Mind-o-Mat-Vault.git, Commit d17ceb6
Phase 1 komplett: Erfolgskriterium erfuellt.
Vault-Notizen als Graph in der Webapp sichtbar (Build + landkarte.json verifiziert).
2026-09-05 11:37:48 +02:00
Jannik
4f174e748e
Phase 1c: init-vault + Indexer + Webapp (Erfolgskriterium)
...
1.3 init-vault:
- Erstellt komplette Vault-Struktur (12 Ordner + .gitignore + Konfig.md + README + CLAUDE.md)
- 2 Demo-Notizen mit heutigem Datum
- git init mit main-Branch
- Fragt interaktiv nach gitea-URL (oder --remote Parameter, --no-interactive)
- Macht initialen Commit
- Idempotent (Vault-existiert-Skip oder --force)
- Argumente: --force, --no-commit, --no-interactive, --remote <url>
1.5 Indexer:
- Deterministisch: 2 Laeufe ergeben byte-identische Outputs (Test bestaetigt)
- Liest Vault, parst Frontmatter mit gray-matter
- Extrahiert Wikilinks mit Regex
- Schreibt landkarte.json + 99_System/Index.md + 10_Wiki/Index.md
- Ueberspringt eigene Outputs (Index.md) und System-Ordner
- Pfad-Normalisierung zu Forward-Slashes fuer Windows-Kompatibilitaet
- Statisches generated-Feld (kein Timestamp) fuer Determinismus
1.6 Webapp:
- Vite + React + TypeScript + Cytoscape.js
- Liest landkarte.json, rendert Force-directed Graph
- Knoten nach Typ eingefaerbt (inbox/daily/wiki/project)
- Hover/Klick zeigt Node-Details
- Build in 2.25s, 32 Module, 590 KB JS (Cytoscape last)
Tests:
- 12 Unit-Tests gruen (10 Vault-Path + 2 Determinismus)
- Indexer-Smoke: 5 Notizen, 3 Kanten auf Test-Vault
- Webapp-Build erfolgreich
Phase 1 Erfolgskriterium: Webapp zeigt Notizen als verbundenen Graph (Build verifiziert)
2026-09-05 11:30:04 +02:00
Jannik
f86c3bf8ce
Phase 1a: Tool-Repo-Skelett + Vault-Pfad-Discovery
...
- package.json mit Scripts (build, dev, test, init-vault, index, ingest, sync)
- TypeScript-Config (tsconfig.json) + Vitest-Config
- CLI-Entry (bin/mindomat.mjs + src/cli/index.ts)
- Vault-Pfad-Discovery (1.2) mit CLI-Arg + Env-Var Fallback
- 10 Unit-Tests fuer Vault-Pfad-Discovery (alle gruen)
- Stubs fuer init-vault, index, ingest, sync (Placeholder, volle Implementierung in 1.3/1.5/2.3/1.8)
- webapp/-Stubs (Phase 1.6 Vorbereitung)
- README mit Install-Anleitung aktualisiert
Smoke-Tests:
- mindomat --version => mindomat 0.1.0
- mindomat --help => vollstaendige Hilfe
- mindomat index => Fehler 'Vault-Pfad fehlt' (Exit 2)
- mindomat index --vault => Stub-Aufruf (Exit 0)
2026-09-05 11:11:55 +02:00