Releases: mykolariabokon/project-mind-mcp
Release list
v0.9.1 — get_context_brief (scout pyramid layer 0)
Deterministic CONTEXT BRIEF tool for coding tasks: hybrid retrieval (vector/BM25) + one-hop import-graph expansion + manifest file skeletons + git recency, ranked and packed into a token budget. Zero LLM calls. Client hints (file mentions, stack frames, identifiers) are first-class signals. See CHANGELOG 0.9.1.
v0.9.0 — AI-Authored Annotations + Lightweight Core + PyPI
The architecture flip: instead of a small embedding model guessing what your code means, your AI assistant writes the search index. Plus: the default install shrank from ~500 MB to a few MB, and ProjectMind is now one uvx away.
✍️ AI-Authored Annotations — semantic search without embeddings
save_annotation(path, summary, keywords)— the assistant saves 1-2 sentence summaries as it works; they're indexed into BM25 and a new near-freeL0_annotquery tierlist_unannotated_files()— coverage report with staleness detection (file changed since annotation)get_annotations(path)— review what the index "knows"- Human-readable
.ai/annotations.json, UTF-8, atomic writes - Natural-language queries ("where are sessions revoked?") now land on the right files with plain keyword search
📦 Lightweight core — the vector stack is optional
chromadb+sentence-transformersmoved to the[vector]extra- Full BM25-only mode: indexing (foreground / background / incremental), search, readiness checks and stats all work without the ML stack — install the extra any time to upgrade in place
- Small-corpus fix: tiny projects (2-3 files) no longer get empty search results when BM25 idf collapses to zero
🚀 Install in one line
claude mcp add --scope user Memory -- uvx projectmind-mcpPublished on PyPI with automated releases via Trusted Publishing (no tokens anywhere).
CI
Unit jobs now exercise BM25-only mode; the integration job installs [vector] and exercises the full ML path — both modes are covered on every push.
Full changelog: CHANGELOG.md
v0.8.0 — Correctness Overhaul + Symbol Graph v3
The biggest release yet: a deep correctness overhaul of the indexing pipeline, a redesigned and finally wired-in symbol graph, and a security fix. All 224 tests green, CI passing on Python 3.10–3.12.
🔒 Security
- BM25 index is now JSON (
.ai/bm25_index.json), never pickle. The old.pkllived inside the target project's.ai/dir, so unpickling it was an arbitrary-code-execution vector when indexing third-party repos. Legacy.pklfiles are cleaned up automatically.
🧬 Symbol Graph v3 — now actually wired in
- Symbols are keyed by qualified id (
path::Class.method) — same-named symbols across files no longer collapse into one node. - New MCP tools:
find_symbol(name)andget_symbol_relations(symbol, relation)— callers / callees / implementors / subclasses / bases / usages, answered in milliseconds without loading the embedding model. - New
L1_symbolsearch tier fuses symbol-name hits intoquery()results via RRF; the background indexer keeps the graph fresh. - Inheritance extraction now works for JS/TS/Java/Ruby (was Python-only); builtin-call noise is filtered; no more double attribution of method calls to their class.
🧹 Index hygiene
- Re-indexing a changed file deletes its previous chunks first; chunks of deleted files are removed from ChromaDB, BM25 and metadata — renamed/removed symbols no longer haunt search results forever.
- Failed upserts are no longer silent: metadata isn't saved, so affected files retry on the next run.
- Query cache is invalidated on every index change; chunk IDs include
line_startso same-named symbols in one file don't overwrite each other. - Three dead tools revived:
search_with_dependencies,search_for_errors,search_architectureread a metadata key that was never written — they silently returned empty results.
⚡ Performance
- Incremental BM25: small changes no longer trigger a full-ChromaDB fetch + full index rewrite.
- Import-graph tools use a precomputed reverse graph (was O(N²·E)).
- pylint runs as a subprocess (in-process runs risked corrupting the MCP stdio protocol).
🪟 Windows & robustness
memory.mdis always UTF-8 — Cyrillic (or any non-ASCII) notes survive round-trips; atomic writes no longer unlink the target first.- Python dotted/relative imports and multi-line JS/TS imports resolve correctly in the dependency graph.
- Thread-safety across the board: context init, tree-sitter parsing, BM25 swaps, background indexer; switching project roots cancels the running background job.
🧪 Testing honesty
- Coverage no longer omits the biggest modules (the old 80% gate measured a fraction of the code); 20+ new regression tests pin every fixed bug.
Full changelog: CHANGELOG.md