Repository navigation
Releases: danieliser/tessera
Release list
v0.11.0 — Go Language Support
What's New
Full Go Language Support
Tessera now indexes Go codebases with the same depth as PHP, TypeScript, Python, and Swift.
Symbols extracted:
- Functions, methods (with receiver type as scope)
- Structs, interfaces, type aliases
- Constants, variables, imports
References & graph edges:
- Function and method calls (simple + package-qualified)
- Struct embedding →
extendsedges (composition as inheritance) - Compile-time interface assertions (
var _ I = (*T)(nil)) →implementsedges - Type references in parameters, return types, and receivers
- Containment edges from method→receiver scope (powers
impact()traversal)
Verified against a real Go project (agentruntime): 118 files, 1,896 symbols, 1,528 cross-file edges. All MCP tools work: search, symbols, references, impact, file_context.
Install
pip install tessera-idx[core-languages]
# or with all extras
pip install tessera-idx[all]tree-sitter-go is now included in core-languages and dev extras.
v0.10.1 — Events Tool
Added
events()MCP tool — query event/hook registrations and emissions across indexed projects- Filter by event name (supports
%wildcard), direction (registers_on,fires, or both) - Mismatch detection:
ORPHANED_LISTENER/UNFIRED_EVENTwith dedicatedmismatch_filter limit/offsetpagination (default 50 per page)- Multi-project parallel queries with scope-gated access
- Filter by event name (supports
event_subtypefield — action vs filter differentiation- PHP:
add_action/do_action→"action",add_filter/apply_filters→"filter" - JS/TS:
@wordpress/hookspackage support (addAction,addFilter,doAction,applyFilters) - Generic events (EventEmitter, DOM, Django signals) omit subtype
- PHP:
- PHP:
do_action_ref_arrayandapply_filters_ref_arraysupport
Full changelog: https://github.com/danieliser/tessera/blob/main/CHANGELOG.md
v0.10.0 — Parser Plugin Architecture + Event Edges
What's New
Parser Plugin Architecture
Drop-in language support. Each language is a single Python module with auto-discovery — no dispatch chains to update. LanguageExtractor base class with declarative event pattern registry.
Directional Event/Hook Edges
Replaces the undirected hooks_into kind with two directional edge types:
registers_on— listener registration (add_action,on,addEventListener,signal.connect)fires— event emission (do_action,emit,dispatchEvent,signal.send)
Works across PHP (WordPress hooks), JavaScript/TypeScript (EventEmitter, DOM events), and Python (Django signals). Enables agents to ask "what listens to this hook?" and "what fires this event?" separately.
Expanded Ignore Patterns
Default ignores now include .pytest_cache/, .ruff_cache/, .webpack-cache/, .nx/, .cursor/, .husky/, .serena/, .phpstan-cache/ — less noise in search results across all project types.
Full Changelog
See CHANGELOG.md for v0.8.0, v0.9.0, and v0.10.0 entries.
pip install tessera-idx==0.10.0
Full Changelog: v0.9.0...v0.10.0
v0.9.0 — Search Quality Validation
Search Quality Improvements
- MDX indexing —
.mdxfiles were completely invisible; now indexed as markdown - Filename-aware RRF boosting — +10% blend MRR by boosting results whose filename matches query tokens
- File-level dedup — keeps only the best chunk per file, freeing result slots for diverse files
- PPR graph boost disabled in search — neutral-to-harmful across all benchmarks; graphs still load for impact/reference analysis
- Lockfile ignore patterns —
pnpm-lock.yaml,yarn.lock,package-lock.json,composer.lock
Validation Results
Tested against Next.js v16.1.6 (3,677 chunks, 1,729 files) and Popup Maker (~580 files):
| Dataset | Doc Top-10 | Cross Top-10 | Code Top-10 | Blend MRR |
|---|---|---|---|---|
| Next.js | 100% | 100% | 70% | 0.748 |
| Popup Maker | — | — | 90% | 0.542 |
Reranker Analysis
Comprehensive sweep of 8 reranker models across multiple pool sizes:
- No reranker wins on large mixed code+doc repos (Next.js)
- Rerankers help on small code-only repos (+68% on Popup Maker)
- BGE-base (768d) vectors are strong enough without reranking
Other Changes
- Async indexing pipeline with hook-driven embedding transforms
- Model profile system for per-model search tuning
- Profile-driven keyword weight in hybrid search
- CodeSearchNet benchmark (#2 on CoIR leaderboard, NDCG@10 91.4)
- 804 tests passing
Full Changelog: v0.8.0...v0.9.0
v0.8.0
Local Embeddings & Cross-Encoder Reranking
Semantic search now works out of the box — no external embedding server required.
pip install tessera-idx[embed]
tessera index /path/to/project # auto-downloads model on first runNew Features
- Local embeddings via fastembed — ONNX Runtime, no PyTorch dependency
- Default:
BAAI/bge-small-en-v1.5(67 MB, 384d) — fast, lightweight - Quality:
jinaai/jina-embeddings-v2-base-code(547 MB, 768d, 8K context) via--embedding-model
- Default:
- Cross-encoder reranking —
jinaai/jina-reranker-v2-base-multilingualreranks results after RRF merge for better precision - Provider auto-detection — HTTP endpoint if configured → fastembed if installed → keyword-only fallback
- New CLI flags:
--embedding-provider,--reranking-model,--no-reranking - Embedding dimension tracking — stored in project metadata, warns on dimension mismatch
Install
pip install tessera-idx[embed] # embeddings + reranking
pip install tessera-idx[all] # everythingFull Changelog: v0.7.2...v0.8.0
v0.7.2
v0.7.1
v0.7.0 — Break-point Markdown Chunker
What's New
Break-point Markdown Chunker
Ported from QMD (TypeScript → Python). Replaces the old header-only chunk_markdown() with a distance-decay scored break-point algorithm.
Key features:
- Scored break points: headers (H1–H6), code fences, blank lines, list items, horizontal rules
- Squared distance decay — a heading 200 tokens back still beats a blank line at the boundary
- Code fence protection — never selects break points inside ``` regions
- 15% overlap between adjacent chunks for context continuity
- Heading hierarchy tracking (
section_heading,parent_section) on every chunk - Defaults: 3600 chars max (~900 tokens), 800 char search window (~200 tokens)
Changed
- Indexer pipeline now uses
chunk_markdown_breakpoint()for.mdand.pdffiles - Old
chunk_markdown()retained indocument.pyfor backward compatibility
Full Changelog: v0.6.0...v0.7.0
v0.5.0 — Search Quality & Graph Intelligence
What's New
Structured Query Types — Control which search lists fire per query:
search("lex:PUM_Popup")— FTS5 keyword onlysearch("vec:error handling strategy")— semantic vector onlysearch("hyde:retry with backoff")— hypothetical document embedding
FTS5 Advanced Mode — Full-text search operators:
- Phrases:
"def hybrid_search"— exact match - Negation:
error NOT warning— exclude terms - Prefix:
hybrid*— prefix matching - Proximity:
NEAR(search query, 5)
Configurable RRF Weights — Tune fusion per query:
weights="keyword=3.0"for identifier-heavy searchesweights="semantic=2.0,graph=1.5"for conceptual searches
Cross-file Edge Resolution v2 — +35% more edges on real PHP projects:
- File-proximity tiebreaking for ambiguous symbol names
- Suffix matching for namespaced symbols
- Diagnostic stats for visibility into resolution quality
Also shipped:
- Rich MCP tool descriptions with strategy guides and worked examples
- 25-test empirical benchmark suite
- BM25 short-circuit, weighted RRF, score normalization
- Content-addressable docids, snippet extraction, multi-format output
embed_querywith retrieval prefix
Live tested on: Tessera (15 files, 373 symbols) and Popup Maker (365 files, 2,760 symbols, 3,778 edges)
Full changelog: https://github.com/danieliser/tessera/blob/main/CHANGELOG.md
v0.4.0 — PPR Graph Intelligence
What's New
PPR Graph Intelligence (Phase 5)
Personalized PageRank is now a third ranking signal in Tessera's hybrid search, bringing structure-aware code retrieval alongside keyword and semantic search.
Core Features:
- Three-way RRF merge — keyword + semantic + PPR graph signal, with graceful degradation when graphs are sparse
graph.py— PPR via scipy CSR sparse matrices with LRU-cached per-query results- Adaptive sparse threshold — percolation theory-based check (density + largest connected component) decides whether PPR engages
- Cross-file edge resolution — post-indexing pass connects unresolved references across files, dramatically improving graph connectivity (LCC from 1.4% → 67.7% on real codebases)
- Memory monitoring — LRU eviction for graph cache with configurable limits
Extended JS/TS Symbol Extraction
- Object property functions (
{ click_open: function() {} }) - Assignment expressions (
window.PUM.foo = function() {}) function_expressionin variable declarations (previously onlyarrow_function)- +475 symbols extracted from Popup Maker Core after fix
Search Quality — Validated on Real Codebases
Tested against Popup Maker ecosystem (Core + Pro, 14,540 symbols, 14,758 edges):
- 4/6 exit intent queries had top result improved by PPR
- Implementation files consistently surface above noise (images, lock files, docs)
- Score lifts up to +59% on relevant queries
Other
doc_searchargument order bug fix- Search latency benchmarks and 80ms threshold guard
- Configurable embedding endpoint for hybrid search and reindex
- Multi-project spike tests with nDCG@5 metrics
- 11,400+ lines of new code and tests
Upgrade
uv sync # or pip install -e .Existing indexes work — PPR engages automatically when graph density is sufficient. No re-indexing required unless you want the improved JS/TS symbol extraction.