Codebase Memory tools (cbm_*) for pi. They answer structural questions about a codebase from a local tree-sitter knowledge graph — before pi falls back to slow grep/read loops.
The extension proxies each tool call to the codebase-memory-mcp server, which maintains a graph of symbols, call chains, and relationships per project.
cd /path/to/this/repo
pi install "$(pwd)"Then /reload in pi (or restart pi) and verify:
pi listExtension tools only — no MCP configuration to maintain. The extension spawns and talks to the local codebase-memory-mcp server itself.
| Tool | Description |
|---|---|
cbm_search_graph |
Symbol search by name pattern or natural-language query |
cbm_trace_path |
Call chains: who calls a function (inbound), what it calls (outbound) |
cbm_get_code_snippet |
Full source for one symbol with metrics |
cbm_get_architecture |
High-level codebase overview (languages, entry points, hotspots) |
cbm_search_code |
Literal text / exact identifier search over indexed files |
cbm_get_graph_schema |
Node/edge labels and relationship patterns |
cbm_query_graph |
Read-only openCypher queries |
cbm_detect_changes |
Map git changes to affected symbols with blast radius |
cbm_list_projects |
All indexed projects with node/edge counts |
cbm_index_status |
Index health (indexed, stale, or missing) with git-HEAD freshness proof |
cbm_index_repository |
Index a repository (one-time; auto-sync keeps it fresh) |
cbm_delete_project |
Remove a project from the knowledge graph (requires UI confirmation) |
cbm_manage_adr |
Create, update, or read Architecture Decision Records |
cbm_ingest_traces |
Ingest runtime traces to validate service-to-service edges |
- Node.js 22.19.0 or newer
- The
codebase-memory-mcpserver binary onPATH, or point theCBM_BINARYenvironment variable at it
codebase-memory-mcp is a separate project; install it from its own source before using these tools.
cd /path/to/project
piAsk pi:
Index this project with cbm_index_repository.
Subsequent queries use the local .codebase-memory/ index in the project.
Good prompts:
Use Codebase Memory. Explain how authentication reaches the request handler.
Use Codebase Memory. What calls PlanBoostSession?
Use Codebase Memory. What would break if I change UserRepository?
Use Codebase Memory. Show files under internal/services and important symbols.
cbm_get_architecture/cbm_search_graphfor broad "how does this work?" questionscbm_trace_pathwhen you already know a function name and want callers/calleescbm_search_graphfor declarations and symbol names, not arbitrary textcbm_search_codefor literal text, exact identifiers, or distinctive stringscbm_detect_changesbefore refactors — blast radius of uncommitted changes
pi extensions are not MCP configuration files. This package registers native pi tools, and each tool proxies one JSON-RPC request to the local codebase-memory-mcp process over stdio:
pi agent
-> pi-cmp extension tool
-> codebase-memory-mcp process (cwd = your project)
-> .codebase-memory/ graph database in the current project
-> structured result back to pi
Additional behavior:
- On
session_startthe project cache is reset;before_agent_startinjects tool-choice guidance into the system prompt. - Tools default to the project matching pi's current working directory; pass
projectexplicitly (seecbm_list_projects) to query others. cbm_index_statuscompares the indexed git HEAD against the repository's current HEAD for real freshness proof (no fabricated timestamps).cbm_delete_projectrequires interactive confirmation when pi has a UI.- Long-running tools (
cbm_index_repository) use a 10-minute timeout; others default to 20 seconds. Errors surface as diagnostics with secrets redacted.
npm install
npm run typecheck # tsc --noEmit
npm test # vitest runInstall the local checkout into pi:
pi install /path/to/pi-cmppi-cmp/
├── extensions/ # extension source only (logic lives here)
│ ├── index.ts # entry point: registers tools, injects guidance
│ ├── tools.ts # cbm_* tool definitions (typebox schemas)
│ ├── mcp-client.ts # spawns codebase-memory-mcp, JSON-RPC over stdio
│ ├── project.ts # project resolution from list_projects output
│ └── sync-check.ts # git-HEAD freshness annotation for index_status
├── __tests__/ # vitest tests (mirror the files above)
├── package.json # pi manifest: "pi": { "extensions": ["./extensions"] }
└── tsconfig.json