semtree v0.2.0
Breaking changes
Indexer::index_filenow takes an additionalOption<&mut FileManifest>argument for incremental indexingIndexer::index_dirnow takesOption<&mut FileManifest>and aon_progress: impl Fn(usize, usize)callbackComplexityReportfields changed: addedpath,start_line,cyclomatic;analyze_chunksnow sorts by cyclomatic complexity instead of line count
New features
Incremental indexing (semtree-rag)
FileManifesttracks per-file content hashes; unchanged files are skipped on re-index- Stale chunks are automatically removed from the store and registry when a file changes or is deleted
collect_indexable_files(dir)is now public
New embedding backends (semtree-embed)
OpenAIEmbedder— callsPOST /v1/embeddings, model and API key configurableOllamaEmbedder— callsPOST /api/embed, model and base URL configurable- New
EmbedConfigfield:api_key(falls back toOPENAI_API_KEYenv var) - New crate features:
openai-backend,ollama-backend
New vector store backend (semtree-store)
QdrantStore— HTTP REST client for Qdrant, lazy collection creation, deterministic point IDs- New crate feature:
qdrant-backend
CLI (semtree-cli)
semtree stats— chunk count, breakdown by language and kind, index size on disksemtree analyze— top N functions by cyclomatic complexity and by line countsemtree index --full— force a complete re-scan, ignoring the incremental manifest- Global
--config <path>flag to point to a custom.semtree.toml - Progress bar with
indicatifduring indexing
Language extractors (semtree-parse)
- Go: fixed struct vs interface detection in
type_declarationnodes - TypeScript: added
enum_declaration,abstract_class_declaration,export_statement(wrapping function/class/interface/enum/type) - JavaScript: added
generator_function_declaration,export_statement - Added
.jsx→ JavaScript language mapping
Analysis (semtree-analyze)
ComplexityReportnow includespath,start_line, and approximatecyclomaticcomplexitycyclomatic_complexity(content, language)exposed as a public function