Skip to content

Releases: danieliser/tessera

v0.11.0 — Go Language Support

Choose a tag to compare

@danieliser danieliser released this 18 Mar 18:23

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 → extends edges (composition as inheritance)
  • Compile-time interface assertions (var _ I = (*T)(nil)) → implements edges
  • 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

Choose a tag to compare

@danieliser danieliser released this 08 Mar 08:52

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_EVENT with dedicated mismatch_filter
    • limit/offset pagination (default 50 per page)
    • Multi-project parallel queries with scope-gated access
  • event_subtype field — action vs filter differentiation
    • PHP: add_action/do_action → "action", add_filter/apply_filters → "filter"
    • JS/TS: @wordpress/hooks package support (addAction, addFilter, doAction, applyFilters)
    • Generic events (EventEmitter, DOM, Django signals) omit subtype
  • PHP: do_action_ref_array and apply_filters_ref_array support

Full changelog: https://github.com/danieliser/tessera/blob/main/CHANGELOG.md

v0.10.0 — Parser Plugin Architecture + Event Edges

Choose a tag to compare

@danieliser danieliser released this 08 Mar 03:14

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

Choose a tag to compare

@danieliser danieliser released this 07 Mar 22:19

Search Quality Improvements

  • MDX indexing — .mdx files 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

Choose a tag to compare

@github-actions github-actions released this 03 Mar 22:39

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 run

New 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
  • Cross-encoder reranking — jinaai/jina-reranker-v2-base-multilingual reranks 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]      # everything

Full Changelog: v0.7.2...v0.8.0

v0.7.2

Choose a tag to compare

@github-actions github-actions released this 03 Mar 21:12

Full Changelog: v0.7.1...v0.7.2

v0.7.1

Choose a tag to compare

@github-actions github-actions released this 03 Mar 21:00

Full Changelog: v0.7.0...v0.7.1

v0.7.0 — Break-point Markdown Chunker

Choose a tag to compare

@danieliser danieliser released this 03 Mar 11:32

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 .md and .pdf files
  • Old chunk_markdown() retained in document.py for backward compatibility

Full Changelog: v0.6.0...v0.7.0

v0.5.0 — Search Quality & Graph Intelligence

Choose a tag to compare

@danieliser danieliser released this 02 Mar 15:17

What's New

Structured Query Types — Control which search lists fire per query:

  • search("lex:PUM_Popup") — FTS5 keyword only
  • search("vec:error handling strategy") — semantic vector only
  • search("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 searches
  • weights="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_query with 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

Choose a tag to compare

@danieliser danieliser released this 01 Mar 03:43

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_expression in variable declarations (previously only arrow_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_search argument 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.