v0.3.0 — Major quality release
44 tools, async I/O, search index with TF-IDF, concurrent write safety, 152 tests.
New tools
extract_links— All wikilinks and URLs from a notedelete_note— Permanently delete a notebulk_tag— Add/remove tags across multiple notesdaily_notes— List all daily notes with statsexport_note— Export as clean markdown or JSON
New Vault category
Bulk operations and vault management tools are now grouped under a dedicated Vault category (10 categories total).
Performance
- All filesystem I/O converted to async (
fs/promises) — non-blocking on large vaults - In-memory search index with incremental updates via file watcher
- TF-IDF scoring — rare terms rank higher than common ones for better search relevance
- Index pre-filters search candidates before reading files from disk
Reliability
- Per-file concurrent write locking — prevents data corruption when multiple operations target the same note
- Proper YAML frontmatter handling via
yamllibrary (no more data corruption) - Collision detection on note creation (no silent overwrites)
- Backlink updates on
rename_noteandmove_note - Graceful shutdown with proper resource cleanup
Search
- Query parser with
path:,tag:#,file:,"exact phrase"operators find_by_dateuses actual file modification time (not string search)searchBatch()reads each file once for multi-query operations
Quality
- 152 tests across 8 files (up from 45 across 4)
- MCP protocol integration tests
- Concurrent write safety tests
- TF-IDF ranking tests
- Tool integration tests with real vault operations
Fixes
- Fixed journal heading duplication bug
- Fixed biased shuffle with Fisher-Yates
- Fixed
find_gaps/find_orphanssubdirectory matching - Fixed config boolean coercion
- Fixed
patchNoteheading level detection - Fixed unused
tagsparameter inremember_ideaandremember_reference - Removed dead
get_active_notetool - Auto
.mdextension normalization on all file operations
Full Changelog: v0.2.1...v0.3.0