57 Commits
Author SHA1 Message Date
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 56788effe5 feat(android): add signed release .aab and .apk, upload keystore, and documentation
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-08 17:49:37 +02:00
Jannik c38f6bc216 chore(android): .gitignore fuer Android-Projekt hinzugefuegt
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-08 17:37:08 +02:00
Jannik 7eeaf6857c feat(android): MainActivity und local.properties Ignore ergaenzt
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-08 17:36:56 +02:00
Jannik 9d72dddbce feat(android): Android App Screens, SpeechManager und ApiClient hinzugefuegt
CI / webapp (push) Canceled after 0s
CI / test (push) Canceled after 0s
2026-09-08 17:36:40 +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 fc51fe725c fix(docker): chokidar und express in production dependencies fuer Server
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-08 17:28:59 +02:00
Jannik ec6d9cf86e feat(entrypoint): Vault-Remote mit Sync-Token und Git-User konfigurieren
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-08 17:20:34 +02:00
Jannik 465f17f253 fix(indexer): ensure 99_System and 10_Wiki directories exist before writing index
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-08 17:11:21 +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 1fd0dcbfa3 Auto-Commit: 2026-09-06 12:51:12
CI / webapp (push) Canceled after 0s
CI / test (push) Canceled after 0s
2026-09-06 12:51:12 +02:00
Jannik 39ea9ddf11 Auto-Commit: 2026-09-05 18:51:10
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-05 18:51:10 +02:00
Jannik af05974e79 Bonus 21: Watcher-Edge-Case-Tests (7 Tests)
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- src/watcher.ts: startInboxWatcher als isolierte Funktion
  - WatcherDeps mit processNote + onError + debounceMs
  - ActiveWatcher mit close()
  - chokidar-Calls entkoppelt vom Ingest-Code
- src/cli/ingest.ts: nutzt startInboxWatcher statt eigener chokidar-Logik
- tests/watcher.test.ts: 7 Edge-Case-Tests
  1. startet und schliesst sauber
  2. verarbeitet neue .md-Dateien
  3. ignoriert Nicht-.md-Dateien
  4. ignoriert Verarbeitet/-Unterordner
  5. Debounce: mehrere schnelle Writes -> eine Verarbeitung
  6. Fehler in processNote via onError-Callback
  7. schliesst sauber ohne haengende Prozesse

Verifiziert:
- 129/129 Tests gruen (vorher 122, 7 neue fuer Watcher)
- Echte chokidar-Integration (nicht gemockt) -> testet die Realitaet
2026-09-05 18:22:46 +02:00
Jannik bf2e6375b0 Bonus 20: Performance-Doku aktualisiert (Pre-Filter wieder entfernt)
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- Pre-Filter (Jaccard-Set-Overlap) hatte keinen messbaren Performance-Vorteil
- TF-IDF Cosinus selbst ist der Bottleneck (O(N^2) mit O(N)-Scan pro Paar)
- 200 Notizen ohne Pre-Filter: ~25s, mit Pre-Filter: 84s (langsamer!)
- Erklaerung: TF-IDF berechnet IDF ueber ALLE Dokumente, was bei vielen
  Aufrufen zu Overhead fuehrt
- Empfehlung (unveraendert): fuer >500 Notizen Embedding-basierte Aehnlichkeit
  (z.B. via QMD) statt TF-IDF

Tests 122/122 gruen.
2026-09-05 18:19:37 +02:00
Jannik f0075e3344 Bonus 19: Playwright E2E-Setup + 4 Smoke-Tests
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- @playwright/test als dev-Dependency
- playwright.config.ts: webServer-Setup, Chromium-Project, baseURL
- tests/e2e/app.spec.ts: 4 E2E-Tests
  - zeigt den Titel
  - zeigt Header mit Logo + Tab-Buttons
  - Tab-Wechsel funktioniert (Graph, Cluster-Karte, Radial)
  - Legend ist sichtbar
- .gitignore: test-results/, playwright-report/
- package.json scripts.test:e2e: 'playwright test'

Verifiziert (manuell):
- 4/4 E2E-Tests gruen (~3s)
- Webapp startet korrekt via Vite, Tests greifen auf rendered DOM zu
- Browser-Download: 195.6 MiB Chromium + Edge-Deps

Hinweis: Playwright laeuft nur lokal. CI-Browser-Downloads waeren separat zu konfigurieren.
2026-09-05 18:12:59 +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 d7b1acbe33 Bonus 17: Sichere API-Key-Speicherung (.env + age-Option)
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- .gitignore: Secrets (.env, *.key, *.pem) + Coverage + Temp-Verzeichnisse
- .env.example: Template ohne echte Werte, mit Anleitung
- scripts/token-gen.mjs: HMAC-Bearer-Token-Generator
- package.json: token-gen + build:twa Scripts
- docs/SECRETS.md: komplette Anleitung
  - Lokale Entwicklung (.env)
  - CI (gitea-Repository-Secrets)
  - age-Verschluesselung als optionale Schicht
  - Was NIE tun / was IMMER tun
  - Incident-Response bei geleaktem Secret

Verifiziert:
- token-gen erzeugt Token korrekt (stderr: Token gueltig...)
- 122/122 Tests gruen
- .env.example im Repo, .env ist gitignored
2026-09-05 18:03:04 +02:00
Jannik 67519ee416 Bonus 16: Coverage-Report + direkter Test fuer findSimilarGroups
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- vitest.config.mjs: Coverage mit v8-Provider
  reporter: text + json-summary
  include: src/**/*.ts, webapp/src/**/*.{ts,tsx}
  exclude: src/templates/** (Templates, kein Code), **/*.test.ts, **/*.d.ts
  Kein Threshold (CLI/Webapp-Komponenten brauchen E2E-Tests)
- @vitest/coverage-v8 als dev-Dependency
- tests/find-similar-groups.test.ts: 5 direkte Unit-Tests
  - leere Liste, zu kurzer Body, nicht-existente Datei
  - aehnliche Notizen werden gefunden
  - Threshold filtert (hoeher = weniger Gruppen)

Verifiziert:
- 122/122 Tests gruen (5 neue)
- Coverage laeuft ohne CI-Fehler
- Module mit hoher Test-Coverage: ingest.ts (100%), vault-path.ts (96%), notes-api-server.ts (80%), notes-api.ts (100%), sync-queue.ts (92%)
- Module mit 0% (CLI-Dispatch, Webapp-Komponenten) brauchen E2E-Tests, die nicht in Scope sind
2026-09-05 17:54:22 +02:00
Jannik 5f6afe2448 Auto-Commit: 2026-09-05 14:51:03
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-05 14:51:03 +02:00
Jannik 62600d7762 CHANGELOG.md: alle Versionen v0.1 bis v3.0 dokumentiert
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- CHANGELOG.md: komplette Historie aller Commits
  - v3.0 (Final): ESLint 9 Flat-Config + Performance-Daten
  - v2.0.12: Backup-Strategie
  - v2.0.11: ESLint in CI
  - v2.0.10: OpenAPI 3.1 Spec
  - v2.0.9: Migrations-Guide Obsidian -> Mind-o-Mat
  - v2.0.8: Production-Haertung (Auth + CORS)
  - v2.0.7: PWA-Manifest + Service-Worker-Tests
  - v2.0.6: jsdom + Notes-Api-Client-Tests
  - v2.0.5: Background-Sync in PWA
  - v2.0.4: NotesApi-Server-Modul
  - v2.0.3: TF-IDF Cosinus-Aehnlichkeit
  - v2.0.2: Watcher-Mode + Lint + Audit-Fix
  - v2.0.1: Phase 3.1 Cluster-Karte
  - v2.0: alle 5 Phasen komplett
  - v1.0: Erfolgskriterium erfuellt
  - v0.5: 2.4 + 2.5
  - v0.3: Phase 4+5
  - v0.2: Wiki-Schema + Suchleiter
  - v0.1: Initial
- Auch .eslintrc.cjs aus Index entfernt (war Backup waehrend Flat-Config-Migration)
2026-09-05 13:05:15 +02:00
Jannik 080656b65a ESLint 9 Flat-Config-Migration (Bonus 14)
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- eslint.config.js (NEU): Flat-Config fuer ESLint 9
  - Globals explizit definiert (console, process, Buffer, etc.)
  - TypeScript-Parser + Plugin
  - Rules: no-unused-vars, no-explicit-any (warn)
  - Tests haben relaxed rules (no-explicit-any off, fuer Mocks)
- .eslintrc.cjs -> .eslintrc.cjs.bak (Deprecation-Warnung weg)
- package.json scripts.lint: USE_FLAT_CONFIG-Flag entfernt (default flat)
- Tests: 2 tote Variablen entfernt
  - tests/tfidf.test.ts: jaccardSim (ungenutzt, nur Kommentar-Vergleich noetig)
  - tests/webapp/manifest.test.ts: indexHtmlPath (ungenutzt)

Verifiziert:
- 117/117 Tests gruen
- ESLint exit 0 (ohne Deprecation-Warnung)
- Tool-Build OK, Webapp-Build OK
2026-09-05 13:03:19 +02:00
Jannik d790ce2493 Spec v3.0: Performance-Section mit Daten aus 100/200-Notizen-Tests
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-05 13:00:47 +02:00
Jannik c883bf8e23 Performance-Test: 100/200 Notizen gemessen, Daten in SPEC v3.0 ergaenzt
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- gen-perf-test.mjs: synthetische Notizen-Generator
  100/200/500 Notizen mit Topics, Tags, Wikilinks
- SPEC v3.0: Performance-Section mit Empfehlungen
  - 100 Notizen: ~12s
  - 200 Notizen: 25s
  - 500 Notizen: >60s (gestoppt, TF-IDF wird Bottleneck)
  - Empfehlung fuer >500: Embedding-basierte Aehnlichkeit statt TF-IDF O(N^2)

Verifiziert:
- 100 Notizen: 100 Knoten, 200 Kanten, 0 Veraltet, 63 KB landkarte.json
- 200 Notizen: 200 Knoten, 400 Kanten
- TF-IDF-Pair-Vergleich skaliert quadratisch (z.B. 200 Notizen = 19.900 Vergleiche)
- Fuer MVP (Vault <500 Notizen) ist die Performance ausreichend
2026-09-05 12:57:52 +02:00
Jannik 9ce9699600 Spec v3.0: finaler Status mit allen 13 Bonus-Punkten, 117 Tests
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-05 12:53:26 +02:00
Jannik e82bd42be2 Spec v3.0 + Plan v2.0: finale Status-Übersicht
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- SPEC v3.0: alle 5 Phasen + 13 Bonus-Punkte als 'komplett' markiert
  - Bonus-Liste: ESLint, Audit-Fix, Watcher, TF-IDF, NotesApi, Background-Sync,
    PWA-Tests, SW-Tests, Auth/CORS, Migration, OpenAPI, ESLint in CI, Backup
  - 117 Tests (mit Aufschlüsselung pro Suite)
  - Verfuegbare Befehle komplett aufgelistet
- Plan v2.0: 13 Bonus-Items im Status-Block ergaenzt
  - 117 Tests (mit Aufschlüsselung pro Suite)
  - Repository-Status dokumentiert

Endstand v3.0/v2.0 auf gitea.
2026-09-05 12:52:35 +02:00
Jannik 1d32d69e5a Auto-Commit: 2026-09-05 12:51:11
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
2026-09-05 12:51:11 +02:00
Jannik 426bb6ddc7 Fix auth-cors Test: HMAC-Tampering-Test war zu schwach (konnte identisches Token erzeugen)
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- Alter Test 'HMAC ist timing-safe' war fehlerhaft:
  - aenderte vorletztes Zeichen via endsWith('0')-Logik
  - in Edge-Cases konnte modified === token sein
- Zwei neue, deterministische Tests:
  1. 'HMAC-Tampering wird erkannt': aendert garantiert das ERSTE Zeichen
     des HMAC, verifiziert modified !== token UND checkAuth lehnt ab
  2. 'Token mit geaendertem Timestamp aber gleichem HMAC wird abgelehnt':
     verifiziert, dass HMAC tatsaechlich an ts gebunden ist (nicht statisch)

Verifiziert:
- 117/117 Tests gruen (vorher 116, 1 Test in 2 aufgeteilt)
- HMAC-Implementation in src/notes-api-server.ts ist korrekt
  (HMAC wird ueber ts berechnet, daher kann ein anderer ts mit gleichem hmac nicht passieren)
2026-09-05 12:51:06 +02:00
Jannik 6ce986c265 v2.0.12: Backup-Strategie dokumentiert
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- docs/BACKUP.md: vollstaendige Backup-Anleitung
  - 3 Ebenen: lokal, gitea (automatisch), externes Backup
  - Empfohlene Strategie: woechentlich + monatlich
  - PowerShell-Backup-Skript mit robocopy + automatischer Cleanup
  - 4 Disaster-Szenarien + Loesungen:
    - Notiz geloescht (git checkout)
    - Vault weg (frischer Clone)
    - Letzter Sync vor Loeschung (Commit-Restore)
    - gitea selbst weg (neue Instanz + Remote-Update)
  - Backup-Hygiene: Verschluesselung, 3-2-1-Regel, Testen, Rotation
  - Vault-spezifische Tipps (sync nach Ingest, etc.)
2026-09-05 12:46:10 +02:00
Jannik 09714801b3 v2.0.11: ESLint in CI-Workflow
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- .gitea/workflows/ci.yml: lint-Job zwischen deps und build
  Reihenfolge: install -> lint -> build -> test
  ESLint-Fehler blocken jetzt den CI-Build
2026-09-05 12:45:02 +02:00
Jannik ecec8c5114 v2.0.10: OpenAPI 3.1 Spec fuer Notes-API
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- docs/openapi.yaml: vollstaendige OpenAPI 3.1 Spezifikation
  - 4 Endpoints: GET /api/notes, GET/PUT /api/notes/{id}, POST /api/sync
  - Schemas: NoteData, SyncResult
  - Auth: Bearer-Token (optional, HMAC-SHA256)
  - Error-Responses: 401 Unauthorized, 404 Not Found, 500 Server Error
  - Beispiele fuer jeden Endpoint
  - Beschreibung von CORS, Background-Sync, Production-Deployment

Kann genutzt werden mit:
- Swagger UI (statisch aus YAML)
- OpenAPI-Code-Generatoren (Client-SDKs in TS, Python, Go, ...)
- API-Testing-Tools (Postman, Insomnia, etc.)
2026-09-05 12:44:15 +02:00
Jannik 6ce8649877 v2.0.9: Migration-Guide Obsidian -> Mind-o-Mat
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- docs/MIGRATION.md: vollstaendiger Migrations-Leitfaden
  - 9 Schritte: Vault-Struktur, Naming, Frontmatter, Tags, Plugins, Tool, QMD, Index, PWA
  - PowerShell-Skripte fuer Ordner-Anlage, Naming-Normalisierung, Tag-Migration
  - Vergleich Obsidian-Workflow vs. Mind-o-Mat-Workflow
  - Was nicht funktioniert (Sync, Publish, Excalidraw, etc.)
  - Haeufige Probleme + Loesungen
  - Rueckkehr zu Obsidian moeglich

Verifiziert: Markdown ist valides CommonMark, keine gebrochenen Links
2026-09-05 12:43:17 +02:00
Jannik 9d70cc615e v2.0.8: Production-Haertung Notes-API (Auth + CORS)
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- src/notes-api-server.ts: NotesApiOptions erweitert
  - authToken: HMAC-SHA256 Bearer-Token (timing-safe compare)
  - allowedOrigins: CORS-Whitelist (oder '*' fuer alle)
- checkAuth(authHeader): pruft Bearer-Token
- generateToken(secret): statische Methode fuer Client-Tools
- checkOrigin(origin): CORS-Pruefung
- corsHeader(origin): liefert CORS-Header (leer wenn nicht erlaubt)
- Token-Format: <timestamp>.<hmac-hex>

Tests:
- tests/auth-cors.test.ts: 14 neue Tests
  - Auth: ohne Token, Header fehlt, falsches Schema, falsches Format
  - Auth: korrekter Token, falsches Secret, HMAC-Tampering
  - CORS: keine Config, Wildcard *, Whitelist
  - CORS: corsHeader mit/ohne Erlaubnis
  - generateToken: Format, verschiedene Secrets

Verifiziert:
- 116/116 Tests gruen (14 neue)
- Auth nutzt timingSafeEqual (kein String-Compare)
- NotesApi bleibt abwaertskompatibel (alte Aufrufe ohne Options funktionieren)
2026-09-05 12:42:05 +02:00
Jannik 2f0768f590 v2.0.7: PWA-Manifest + Service-Worker-Tests (Phase 4.2)
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- tests/webapp/manifest.test.ts: 14 neue Tests
  - PWA-Manifest: existiert, hat Pflichtfelder (name, short_name, start_url, display, icons)
  - Icons: icon-192.svg, icon-512.svg existieren, sind valides SVG mit viewBox
  - Service-Worker: hat install/activate/fetch Handler
  - Background-Sync Handler mit 'mindomat-sync' Tag
  - CACHE_NAME + PRECACHE_URLS mit Pflicht-Dateien
  - Ueberspringt /api/ vom Caching
  - index.html: link zu manifest.webmanifest, navigator.serviceWorker.register

Verifiziert:
- 102/102 Tests gruen (14 neue)
- PWA-Manifest + Service-Worker + Icons sind vorhanden und korrekt
2026-09-05 12:40:51 +02:00
Jannik fb954fff1d v2.0.6: jsdom + Notes-Api-Client-Tests (Phase 4.1)
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- jsdom + @testing/react als dev-Dependencies
- vitest.config.mjs: environmentMatchGlobs fuer *.webapp.* und sync-queue Tests
- tests/webapp/notes-api-client.test.ts: 9 Tests
  - loadNote: 404 -> null, 200 -> parsed, 500 -> throws
  - URL-Encoding: Leerzeichen in noteId
  - saveNote: PUT mit Content-Type, Body korrekt
  - triggerSync: 200 -> ok, 500 -> throws
  - listNotes: parst Notes-Liste, Fehlerfall

Verifiziert:
- 88/88 Tests gruen (9 neue fuer notes-api Client)
- Tool + Webapp Builds OK
2026-09-05 12:40:02 +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 7fdca79419 v2.0.3: TF-IDF Cosinus-Aehnlichkeit (2.5-erweitert)
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- src/ingest.ts: tfIdfCosineSimilarity(docs, doc1, doc2)
  Deterministisch, keine externen Abhaengigkeiten
  IDF log(N/df) + 1, TF-IDF-Vektor, Cosinus
- src/cli/index-cmd.ts: findSimilarGroups(vaultPath, nodes, threshold)
  Liest Body-Text jeder Notiz, paarweiser TF-IDF-Vergleich
  rendert 'Aehnliche Notizen'-Sektion in 99_System/Index.md
  Threshold 0.15 (TF-IDF Cosinus ist konservativer als Jaccard)
- tests/tfidf.test.ts: 5 neue Tests
  - identische Dokumente: 1.0
  - thematisch aehnliche > thematisch ungleiche
  - 0.0 wenn doc nicht im Korpus
  - symmetrisch: sim(a,b) == sim(b,a)
  - TF-IDF diskriminiert besser als Jaccard

Verifiziert:
- 61/61 Tests gruen (10 neue fuer TF-IDF)
- E2E: 2 aehnliche Kaffee-Notizen -> 'Aehnlich (Score 0.34)' in Index.md
- Ungleiche Notiz (Sport) wird nicht als aehnlich markiert
- Jaccard bleibt als einfachere Alternative erhalten
2026-09-05 12:33:56 +02:00
Jannik f2e8e59baf v2.0.2: Watcher-Mode + Watch-Bug-Fix + Lint-Setup + Audit-Fix
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
Phase 6 (Bonus): Watcher-Mode (--watch):
- src/cli/ingest.ts: --watch Flag parsed
- watchInbox(): chokidar-basiert (robuster als node:fs.watch auf Windows)
  Debounce 1s, awaitWriteFinish, ignoreInitial, filter Verarbeitet/Problemfaelle
  Auf Ctrl+C wird sauber beendet
- Bug-Fix: 'return' bei files.length===0 war vor dem Watch-Block
  -> bei leerer Inbox mit --watch startet Watcher trotzdem

ESLint + Prettier:
- .eslintrc.cjs (deprecated eslintrc-Format, USE_FLAT_CONFIG=false)
- .prettierrc mit Standard-Format
- package.json scripts: lint, format, format:check
- Lint-Fehler in Tests gefixt (try/catch, unused imports)

npm audit fix --force:
- esbuild 0.24.2 -> neuere Version (via Vite-Update)
- vite, vitest auf v5 (breaking change akzeptiert)
- 5 vulnerabilities -> 0

Verifiziert:
- 50/50 Tests gruen
- Watcher E2E: Notiz in 00_Inbox/ waehrend --watch -> Wiki erstellt, verarbeitet
- Lint: 0 Fehler (nur Deprecation-Warnung fuer eslintrc-Format)

Dependencies: chokidar (neu)
2026-09-05 12:29:48 +02:00
Jannik e6356f8fac v2.0.1: CI-Workflow + README mit Architektur-Diagramm
CI / test (push) Canceled after 0s
CI / webapp (push) Canceled after 0s
- .gitea/workflows/ci.yml: gitea-Actions-Workflow
  - Job 1 (test): npm ci + build + test auf Node 22
  - Job 2 (webapp): webapp-Build + Artifact-Verifikation
  - Trigger: push + pull_request auf main
- README.md komplett neu strukturiert:
  - Architektur-Diagramm (ASCII) mit allen 5 Bausteinen
  - 5-Bausteine-Tabelle mit Spalte 'Wo' (Tool/Vault/QMD)
  - Installations-Anleitung (Tool, Vault, QMD, Webapp)
  - Beispiel-Session end-to-end
  - Erweiterte CLI-Referenz mit allen Optionen
  - Test-Anleitung
2026-09-05 12:11:37 +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 ec12b565be Phase 2.5: Duplikat-Erkennung mit Hash-Vergleich
- contentHash-Feld im VaultNode (SHA-256, erste 16 Zeichen vom Body ohne Frontmatter)
- findDuplicateGroups(): gruppiert Notizen nach Hash, nur Gruppen mit >= 2 Nodes
- 99_System/Index.md: neue Sektion 'Moegliche Duplikate' (oberste Stelle, vor den Typ-Gruppen)
- 6 Unit-Tests: leere Liste, einzelne Notiz, 2/3 gleicher Hash, mehrere Gruppen, Sortierung

Hinweis: Embedding-basierte inhaltliche Aehnlichkeit (z.B. cosine > 0.9) braucht QMD und ist Phase 2.5-erweitert. Aktuell nur exakte Hash-Matches.
2026-09-05 11:56:21 +02:00
Jannik 7a6353b703 Phase 2.3: Ingest mit Minimax HTTP-API + Mock-Modus
- src/llm.ts: LLM-Client (fetch + Bearer-Auth) mit --mock Modus fuer Tests
  - loadLLMConfig liest Konfig + Env-Var (kein API-Key im Code/Repo)
  - mockResponse extrahiert Notiz-Body, baut Wiki-JSON-Antwort
- src/cli/ingest.ts: Ingest-Hauptlogik
  - Liest Konfig + Schema + Indexe
  - Iteriert ueber 00_Inbox/*.md (oder spezifische Notiz mit --note)
  - Baut Karpathy-Prompt: System + User mit Schema/Indexen/Notiz
  - Ruft LLM, parst JSON-Antwort
  - Schreibt Wiki-Seite mit vollstaendigem Frontmatter (alle Pflichtfelder + 3 Konflikt-Booleans + sources)
  - Verschiebt Original nach 00_Inbox/Verarbeitet/YYYY-MM-DD/
  - Bei Fehler: nach 00_Inbox/Problemfaelle/ + Log-Eintrag
  - Optionen: --mock (ohne API-Key), --note <pfad> (eine Notiz), --dry-run (nicht schreiben)
- tests/ingest-e2e.test.ts: 2 E2E-Tests mit --mock
  - Wiki wird erstellt mit korrektem Frontmatter
  - Original wird nach Verarbeitet/ verschoben
  - Inbox ist leer nach Ingest

Tests: 22/22 gruen (10 vault-path + 8 stale + 2 ingest-e2e + 2 determinism)

E2E verifiziert auf Test-Vault:
- 1 Inbox-Notiz rein -> 1 Wiki-Seite raus
- Frontmatter sauber, sources zeigen auf Original
- Original nach Verarbeitet/2026-09-05/ verschoben

Phase 2 fast komplett: 2.1, 2.2, 2.3, 2.6 erledigt. 2.4 Konflikte (im LLM-Prompt), 2.5 Duplikate (TODO) offen.
2026-09-05 11:52:53 +02:00
Jannik f4d4548c92 Cleanup: debug-Skripte, vitest-logs, dist/ ignorieren 2026-09-05 11:45:33 +02:00
Jannik a47bfffe9b Phase 2: Wiki-Schema + Suchleiter + Veraltet-Erkennung (2.1, 2.2, 2.6)
2.1 Wiki-Schema:
- src/templates/_Schema.md als Vorlage
- Wird beim init-vault nach 10_Wiki/_Schema.md kopiert
- Definiert: Pflichtfelder, 5 Status-Werte, 3 Konflikt-Booleans, Callout-Format, Quellen-Liste

2.2 CLAUDE.md (Suchleiter):
- src/templates/CLAUDE.md als Vorlage
- Wird beim init-vault nach CLAUDE.md kopiert
- Konkreter Prompt: Lese-Reihenfolge, Antwort-Format (nummeriert, max 3 Quellen), Token-Budget-Hinweis
- Konflikt-/Veraltet-Markierungen automatisch
- Wiki > QMD Priorisierung

2.6 Veraltet-Erkennung:
- Schwelle aus 99_System/Konfig.md (veraltet_schwellwert_monate, Default 12)
- isStale(): boolean, Wiki-Seiten ausgenommen
- aktualisiert hat Vorrang vor created
- In landkarte.json: veraltet=true|false pro Node
- In 99_System/Index.md: ⚠️ vor veralteten Notizen
- 8 Unit-Tests (alle gruen): Wiki, frisch, alt, aktualisiert-Prioritaet, fehlende Daten, ungueltiges Datum, Schwelle=0, genaue Schwelle

init-vault aktualisiert:
- Laedt Templates aus src/templates/ via loadTemplate()
- Schreibt 10_Wiki/_Schema.md zusaetzlich zu CLAUDE.md

Verifiziert: 13-Monate-alte Notiz wird mit ⚠️ markiert, frische ohne.
2026-09-05 11:45:07 +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