Help us improve
Share bugs, ideas, or general feedback.
From basemind
Navigates codebases via MCP: symbol search, reference/caller lookups, commit history, blame, and diffs. Avoids grepping or reading whole files.
npx claudepluginhub goldziher/basemind --plugin basemindHow this skill is triggered — by the user, by Claude, or both
Slash command
/basemind:basemindThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
basemind is a tree-sitter-backed code map plus git context, served over MCP. It
Explores codebases with Repowise indexing for architecture understanding, searching, and answering questions without raw source grepping.
Builds a mental model of unfamiliar codebases by searching, reading dependencies, and checking git history. Use when onboarding or before editing unknown code.
Share bugs, ideas, or general feedback.
basemind is a tree-sitter-backed code map plus git context, served over MCP. It pre-indexes a repository into a Fjall inverted index so structural and historical questions resolve in milliseconds — without you reading whole files.
grep / read_file)Use basemind for:
Foo defined?", "find the constructor for Bar", "show me every type ending in Service".process_file?", "who depends on this module?".foo.rs between HEAD~5 and HEAD".If you are about to open more than two or three files just to learn structure, stop
and use basemind first. The tools return paths + line numbers; you only read_file
once you know exactly which span you need.
| Question | Tool |
|---|---|
| "Where is X defined?" | search_symbols (substring match, optional kind filter) |
| "What's the shape of file F?" | outline (add l2: true for calls + docs) |
| "What calls X?" (any name) | find_references |
| "What calls this specific definition?" | find_callers (path + name + optional kind) |
| "What imports module M?" | dependents |
| "What files are indexed?" | list_files (filter by language or path_contains) |
| "What changed recently?" | recent_changes, commits_touching, find_commits_by_path |
| "When did symbol X last change?" | symbol_history |
| "Who wrote this line / symbol?" | blame_file, blame_symbol |
| "Where's the churn?" | hot_files |
| "What's dirty in the working tree?" | working_tree_status |
| "What's HEAD / branch?" | repo_info |
| "Show diff between revs for file F" | diff_file, diff_outline |
| "What's indexed?" | status |
| "Semantic search over PDFs / Office docs in the repo?" | search_documents (requires --features documents) |
| "Recall something the agent stored earlier?" | memory_get exact, memory_list prefix, memory_search KNN |
| "Remember this for future sessions?" | memory_put (delete with memory_delete) |
| "Refresh the index after editing code?" | rescan — no MCP disconnect needed; optional paths arg |
| "How much has basemind helped today?" | telemetry_summary — per-tool histogram + estimated tokens saved |
basemind needs an index at .basemind/ before it can answer queries. From the repo root:
basemind scan
This walks the tree, parses with tree-sitter, and writes a content-addressed blob
store + Fjall inverted index under .basemind/. A few seconds for small repos,
~15 s for a ~40k-file TypeScript monorepo.
The MCP server is launched by the host (basemind serve — wired up in
.claude-plugin/plugin.json for you). You do not start it manually.
Re-run basemind scan after large changes, or run basemind watch to keep the index fresh on file save.
If a tool returns "no indexed files", that means basemind scan hasn't been run in this repo yet.
search_symbols { needle: "MapCache" }
→ src/mcp/mod.rs:79:1 MapCache (struct)
src/mcp/mod.rs:88:1 MapCache (impl)
Now you know exactly where to read.
find_references { name: "process_file" }
→ src/scanner.rs:142:9 process_file
src/scanner.rs:201:13 process_file
...
No need to grep — the index already knows.
outline { path: "src/mcp/tools.rs" }
→ 21 #[tool] outline (function)
112 #[tool] search_symbols (function)
...
A 1000-line file becomes a 30-line table of contents.
limit, default 100, max 1000). Index scanners use
scan_cap = limit * 8 to bound work on common names.find_references("bar") matches Foo::bar()
and bar() alike. There is no scope resolution; cross-check with outline if
disambiguation matters.basemind serve to be running inside a git repository. Outside a git repo they return a clear error.search_documents, memory_*) require basemind to be built with
--features full (or the individual documents / memory flags). Without them the
tools dispatch but return an MCP error.
Memory is scoped by the normalised origin remote URL (git@github.com:Foo/bar.git and
https://github.com/Foo/bar/ collapse to the same scope key) — clones of the same repo
share memory; unrelated repos do not see each other's entries.