Skip to content

Latest commit

 

History

History
57 lines (35 loc) · 6.22 KB

File metadata and controls

57 lines (35 loc) · 6.22 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

AI MANAGED

[Unreleased]

Added

  • Storage adapter: DiskDriver seam, DiskAdapter (injected driver), 4 new trachyte-fs ops (delete/list/exists/mkdir) + IPC commands, vitest harness for @trachyte/core

  • Vault manager: real VaultManager (open/create/adopt/list with vault-layout validation, typed VaultError, current-vault state); dir-aware MemoryAdapter (directory tracking, immediate-children listFiles); vitest for all methods

  • Settings service: SettingsService (load/save with .bak (last-known-good fallback), runtime schema validation, schema_version stamping + version gate); isSettings type guard; shared joinPath path util (now used by VaultManager too)

  • External file-change reload: debounced ExternalChangeReloader (file:changed / file:created triggers a reload after a 100 ms quiet window); watch_vault IPC now relays notify events to the frontend via the trachyte://fs-event Tauri event

  • Minimal open-vault / open-note demo in Home.tsx: type a vault path, open a note, watch external edits sync into the editor

  • Vault path resolution: home_dir IPC command (dirs) + resolveHomePath in core — ~/ and relative vault paths now resolve to absolute paths anywhere on disk

  • trachyte doctor dev-tools: doctor IPC command (vault validity + missing dirs/files + schema_version value), core aggregator (buildDoctorReport / settingsValidity reusing isSettings), and a DoctorPanel opened via the sidebar "Run doctor" button or Ctrl+Shift+D

  • trachyte-db SQLite bootstrap: Database wrapper (open → pragmas → migrate) with PRAGMA journal_mode=WAL/synchronous=NORMAL/foreign_keys=ON; schema v1 (files/headings/tags/backlinks with ON DELETE CASCADE); FTS5 mirror table content_fts (porter tokenizer) + search; BLAKE3 hash_content; versioned migration runner (PRAGMA user_version, one tx per migration)

  • trachyte-db IPC exposure: index_search / index_insert_file commands (per-call open of <vault>/.trachyte/index.db), IpcError::InvalidQuery for malformed FTS5 queries, IpcError::Db, typed ipc/db.ts wrapper

  • Event-driven Indexer in core (upsert/delete/rename on vault events + startup sweep that converges missed events); IndexDriver seam + MemoryIndexDriver (test default) and tauriIndexDriver in the app; extractIndexContent frontmatter strip; IndexedFileMeta/IndexEvent types; write commands index_upsert_file / index_delete_file / index_list_files + typed ipc/db.ts wrappers

  • Transactional Indexer.rebuild() (single-tx wipe-and-rebuild in trachyte-db, deletes corrupt <vault>/.trachyte/index.db* first); index_rebuild IPC command; IndexDriver/MemoryIndexDriver/tauriIndexDriver rebuild support; "Rebuild index" button in DoctorPanel; Indexer now wired into the app (started on vault open, disposed on close); insert_file/upsert_file are transactional (files row + FTS refresh in one tx)

  • Core search service (SearchService.search(query) returning typed Hit[] from the index only, never parses MD at query time); filename + content submodes with disjoint, deduplicated hits (filename ranked first); IndexDriver/MemoryIndexDriver/tauriIndexDriver gain search (memory substring / existing index_search IPC); normalizeQuery; vitest specs + 10k-note p95 < 50 ms perf check

  • Search UI: SearchPalette modal (Ctrl+Shift+F + sidebar "Search" button) with a hand-rolled focus trap, role=dialog/aria-modal="true", listbox/option semantics via aria-activedescendant/aria-selected, keyboard nav (arrows/Enter/Escape/Tab wrap) and submode badges; useSearch hook (150 ms debounce, stale-response guard, injectable SearchService for tests); desktop test harness (vitest + jsdom + testing-library + axe-core) with functional specs and an axe smoke test

  • Wikilinks + block refs in CM6: wikilinks() extension ([[target]] highlighted, title-first + path//.md escape-hatch resolution, resolved vs faint-unresolved styling, click-to-open note via handleWikilinkClick); blockRefs() extension (^id line-end definitions decorated, #^id decoded in link targets); CodeMirrorEditor gains links/onOpenLink props (resolution data injected from the app — editor stays Tauri-free); Home.tsx builds the title→path index from VaultManager.list() and wires link navigation; first @trachyte/editor vitest harness (resolver + wikilink extension specs)

  • Link/heading/tag data layer: MD parser extracts [[wikilinks]] (char-offset positions), #headings, and #tags; Indexer persists them to the headings/tags/backlinks tables via the new IndexDriver.storeExtracted method; IndexDriver.backlinks(vaultPath, target) query returns source notes + char positions (Rust store_extracted/list_backlinks, IPC index_store_extracted/index_list_backlinks, desktop wrappers); wikilink resolver relocated into core and shared with the editor

  • BacklinksPane: right-hand pane showing backlinks for the open note with click-to-navigate

  • Wikilink block references: [[note#^blockId]] now scrolls to the ^blockId line in the target note

  • Editor scrollToPos prop for programmatic scrolling to character positions

  • Fixed duplicate Ctrl+Shift+D keydown handler in Home.tsx

Changed

  • CI Hardening for ci.yml now checks inside app/desktop to confirm build ablility

Fixed

  • Vault creation no longer lands inside the app's working tree (apps/desktop/src-tauri/…), which caused tauri dev rebuilds to restart the window and wipe the open vault/note state
  • External-change reloader no longer unsubscribes itself under React StrictMode (idempotent start() / dispose() lifecycle)
  • Doctor panel layout: "Rebuild index" button and its result no longer render inside the header row (was breaking the flex header layout)
  • Doctor panel modal a11y: focus trap (Tab wraps close ⇄ rebuild), Escape to close, auto-focus on open, accessible name via aria-labelledby
  • Home.tsx: index rebuild no longer uses the indexer! non-null assertion

Removed