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
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
Jannik
707e96c116
Spec v0.5 + Plan v0.1: Blockierer geklaert, 20 Aufgaben definiert
...
- Spec v0.5: 4 Klaerungs-Eintraege (Vault-Pfad, Deployment, Init-Konzept, Teststrategie)
- Spec v0.5: 4 offene Punkte als geloest markiert
- Plan.md NEU: 20 Aufgaben ueber 5 Phasen mit Test + Fertigkriterium
- Phase 1a: Tool-Code (Struktur, Vault-Pfad-Discovery)
- Phase 1b: Vault-Init (init-vault Skript, Demo-Notizen)
- Phase 1c: Indexer + Webapp (Graph sichtbar, Sync)
- Phase 2: Wiki + Ingest (Schema, Suchleiter, Konflikt/Duplikat/Veraltet)
- Phase 3: Visuell (Cluster-Karte, Radial)
- Phase 4: PWA-Editor + Mobile
- Phase 5: Native App (optional)
- Aufwand-Schaetzung: 20-24 Tage fuer eine Person
2026-09-05 11:05:41 +02:00
Jannik
cee1f4c8f7
Spec v0.4: Repository-Trennung Tool/Vault sauber dokumentiert
...
- 2 Repos: Tool-Repo (dieses Repo, Code) + Vault-Repo (Daten, separat)
- § 1: expliziter Hinweis auf zwei Repositories
- § 3: neue Tabelle 'Was es tut - und wo es lebt'
- § 4: Architektur-Tabelle um Repo-Spalte erweitert
- § 5: in 5.1 Vault-Repo und 5.2 Tool-Repo aufgeteilt
- § 12: QMD-Realitaetstest dokumentiert (verifiziert 2026-09-05)
- § 15: Bau-Reihenfolge in Sub-Phasen 1a/1b/1c (Tool-Code, Vault-Init, Indexer+Webapp)
- § 16: 3 neue Klaerungs-Eintraege (Repository-Trennung, Vault-Pfad, QMD-Realitaet)
- § 17: 3 neue offene Punkte (Vault-Init-Skript, Deployment-Mechanik, Vault-Pfad-Discovery)
2026-09-05 10:41:22 +02:00
Jannik
15bb77d7a8
Spec v0.3: Cloud-Sync via gitea, Mobile (Android), PWA-Editor, Minimax-KI via API, Konfig.md
...
- Cloud-Sync erlaubt ueber gitea (kein externes Cloud-Drive)
- Mobile nur Android + Windows-Browser, kein iOS
- Externe KI ueber Minimax HTTP-API (API-Key in Environment-Variable, Name in Konfig.md)
- Editor = eigene PWA, Obsidian-Like, kostenlos, self-hosted
- Tiptap als Markdown-Editor, Cytoscape.js fuer Force-directed Graph
- 4 Phasen: MVP, Wiki+Ingest, Visuell, PWA-Editor
- Konfig.md als zentrale Settings-Datei (Schwelle, Token-Budget, KI, Sync)
- Deutsche Frontmatter-Keys (aktualisiert, quellen)
- Token-Budget aus Konfig, kein Hardcap
- 3 boolsche Konflikt-Felder (alle explizit gesetzt)
- 5 Wiki-Status deutsch (neu/aktuell/konflikt/entwurf/archiv)
- 3 Mockup-Stile sequenziell (Graph, Karte, Radial)
- Cluster dynamisch, Auto-Modus mit manueller Korrektur
- 17 Sektionen, 31 Klaerungen, 15 offene Punkte
2026-09-05 10:14:33 +02:00
Jannik
a6ab6d03ee
Auto-Commit: 2026-09-05 02:51:11
2026-09-05 02:51:11 +02:00
Jannik
7cd818c652
Initial spec: Mind-o-Mat Entwurf v0.1
2026-08-28 21:15:24 +02:00