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
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
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
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
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
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
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
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
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
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
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
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