CLI Reference
Complete command-line interface documentation for NeuralMind.
Table of Contents
- Overview
- Global Options
- Commands
- build
- scan-for-secrets
- query
- wakeup
- search
- benchmark
- probe
- stats
- validate
- doctor
- eval
- ingest-content
- learn — document ingestion
- learn (deprecated, pre-v1.11.0)
- self-improve status
- next
- memory
- skeleton
- structural
- last
- install-hooks
- init-hook
- drift
- compliance
- ci-check
- export
- watch
- serve
- daemon
- savings
- review
- onboarding
- optimize-docs
- Exit Codes
- Environment Variables
- Examples
Overview
NeuralMind provides a command-line interface for building neural indexes, querying codebases with natural language, and managing knowledge graphs.
neuralmind [OPTIONS] COMMAND [ARGS]
Getting Help
# General help
neuralmind --help
# Command-specific help
neuralmind build --help
neuralmind query --help
Global Options
| Option | Description |
|---|---|
--help |
Show help message and exit |
--version |
Show version number |
Commands
audit recent (v3.1.4+)
Query recent audit trail events.
Arguments
| Argument | Required | Default | Description |
|---|---|---|---|
-n |
No | 10 |
Number of events to show |
--category |
No | — | Filter by category (backend, compliance, audit) |
--action |
No | — | Filter by action (build, query, export) |
--actor |
No | — | Filter by actor |
--since |
No | — | Filter by timestamp (ISO 8601) |
Output
Recent audit events in tabular format.
Examples
# Show last 10 audit events
neuralmind audit recent
# Show last 20 events since a specific date
neuralmind audit recent -n 20 --since "2026-08-01"
# Show only backend builds
neuralmind audit recent --category backend --action build
Prerequisites
Requires an initialized project with audit trail.
build
Build or rebuild the neural index from a knowledge graph.
neuralmind build <project_path> [OPTIONS]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
Yes | Path to project root containing graphify-out/graph.json |
Options
| Option | Default | Description |
|---|---|---|
--force, -f |
False | Force re-embedding of all nodes, even if unchanged |
--dry-run |
False | Scan the project and estimate token savings without building the index (v0.39.0+) |
--redact-secrets |
False | Replace detected credentials with a [REDACTED:kind] marker in text entering the index, on all three backends. Equivalent to NEURALMIND_REDACT_SECRETS=1. Off by default because redacting costs recall on legitimately secret-shaped identifiers — run neuralmind scan-for-secrets first; removing and rotating the credential is the actual fix. |
--json, -j |
False | Emit structured JSON output (for --dry-run) |
Output
Displays build statistics including:
- Number of nodes processed
- Number of nodes embedded (new/changed)
- Number of nodes skipped (unchanged)
- Number of communities indexed
- Build time elapsed
Examples
# Basic build
neuralmind build /path/to/project
# Force complete rebuild
neuralmind build /path/to/project --force
# Estimate token savings without building (Gap 1: 1-click setup)
neuralmind build /path/to/project --dry-run
# → NeuralMind dry run — my-project
# → Files scanned : 142
# → Lines of code : 18,342
# → Languages : 89 Python, 53 TypeScript
# → Est. token reduction : ~42x per query
# → No index was built. Run `neuralmind build .` to activate these savings.
Prerequisites
As of v0.15.0, none beyond pip install neuralmind. When no
graphify-out/graph.json exists, build auto-generates one with the bundled
tree-sitter backend (neuralmind/graphgen.py) and prints:
[neuralmind] generated code graph via the built-in tree-sitter backend → graphify-out/graph.json
Backend precedence:
- A real graphify graph always takes priority where present (
graphify update /path/to/project). - Otherwise the built-in tree-sitter backend generates the graph. It indexes Python, TypeScript, Go, Rust, Java, C, C++, C#, Ruby, and PHP (
.py,.ts/.tsx,.go,.rs,.java,.c/.h,.cpp/.cc/.cxx/.hpp/.hh/.hxx,.cs,.rb,.php) out of the box (Java added in v0.28.0; C and C++ in v0.32.0; C# in v0.35.0; Ruby in v0.36.0; PHP in v0.37.0); more grammars register behind theSUPPORTED_SUFFIXESseam. A mixed-language repo is indexed in one pass. Schema artifacts (v0.40.0+) are indexed alongside code asdocumentnodes: OpenAPI/AsyncAPI specs (.yaml/.ymlwith anopenapi/asyncapi/swaggerkey) emit nodes per path+method, schema component, and channel; SQL DDL (.sql) emits one node perCREATEobject; Protocol Buffers (.proto) emit nodes permessage,service,rpc, andenum. Plain YAML config files are silently skipped. --forceonly regenerates graphs we wrote — it never clobbers a graphify build.- An empty/non-code project writes no graph, so you still get the “no graph” guidance rather than a silent 0-node success.
- Optional precision (v0.17.0+): set
NEURALMIND_PRECISION=1and place a*.scipindex (fromscip-python/scip-typescript/scip-go) in the project root to replace the built-in backend’s heuristiccalls/inheritsedges with compiler-accurate ones for the files the index covers. Off by default. -
Secret redaction (opt-in):
--redact-secrets(orNEURALMIND_REDACT_SECRETS=1) replaces detected credentials with[REDACTED:<kind>]in embedded text — document chunks and node descriptions — on all three backends. Off by default, because redacting costs recall on legitimately secret-shaped identifiers.What it does not cover. Node labels,
graphify-out/graph.jsonand.neuralmind/index_ir.jsonare written before the embedding step, so a credential inside a symbol name or docstring still reaches those files verbatim (on every backend — this is not backend-specific). Verify withgrep -r '<the-secret>' graphify-out/ .neuralmind/after a build if it matters to you.The flag is a backstop for text that reaches the vector store, not a guarantee that no artifact under the project holds the credential. Run
neuralmind scan-for-secrets .first — removing and rotating is the actual fix. The build also warns if git is already tracking files under.neuralmind/.
scan-for-secrets
Report credentials present in a project’s files, so they can be removed and rotated before they reach the index, a commit, or an agent’s context.
neuralmind scan-for-secrets [PROJECT_PATH] [--high-confidence-only] [--strict]
[--use-neuralmindignore] [--json]
| Option | Effect |
|---|---|
PROJECT_PATH |
Project root (default .). |
--high-confidence-only |
Report only vendor-shaped credentials; suppress the generic-assignment heuristic. |
--strict |
Exit non-zero on heuristic findings too (default: high-confidence only). |
--use-neuralmindignore |
Also apply .neuralmindignore globs. Off by default — see below. |
--json / -j |
Machine-readable output. |
NeuralMind secret scan — /home/dev/myproject
[HIGH ] .env:1 anthropic-api-key (sk-a…(43 chars))
[HIGH ] src/config.py:8 aws-access-key-id (AKIA…(20 chars))
[maybe] src/db.py:34 generic-secret-assignment (9f8K…(28 chars))
2 high-confidence, 1 heuristic.
Two confidence tiers. HIGH matches a vendor-specific shape and
effectively never fires on prose: Anthropic and OpenAI keys, AWS access
key IDs and secret keys, GitHub tokens and fine-grained PATs, Slack
tokens, Google API keys, Stripe keys, PyPI and npm tokens, PEM private-key
blocks, JWTs, Authorization: Bearer/Basic headers, and passwords
embedded in database connection strings. maybe matches a generic
SECRET=value assignment that cleared a Shannon-entropy threshold and a
placeholder denylist — so password = "changeme",
api_key = os.environ["X"], and KEY=${VAR} are not reported.
Previews never include the tail of a secret — only a short prefix and a length — so scan output is safe to paste into an issue or a CI log.
Exit codes, so this works as a CI gate:
| Condition | Exit |
|---|---|
| No findings | 0 |
| Heuristic findings only | 0 (1 with --strict) |
| Any high-confidence finding | 1 |
| Path does not exist | 2 |
The scanner reads files directly rather than going through the indexer, so
it sees .env and other files build never parses. It skips the usual
vendored/build directories (node_modules, .venv, dist, target,
.git, .neuralmind), binary files, and anything over 5 MB.
.neuralmindignore is not applied by default. That file is tuned for
retrieval quality, not security — NeuralMind’s own copy excludes docs/,
*.md and tests/ because markdown dilutes code retrieval. A scanner that
inherited it would skip exactly where credentials tend to sit and report a
false all-clear. Pass --use-neuralmindignore if you want those globs
applied anyway.
Related: neuralmind build . --redact-secrets scrubs detected credentials
out of indexed text as a backstop — it does not remove the credential from
your working tree, and it is not a substitute for rotating a key that has
already been exposed.
query
Query the codebase with natural language and get optimized context.
neuralmind query <project_path> "<question>" [OPTIONS]
Type Filter (v3.1.4+)
Filter results by node type:
| Flag | Description |
|---|---|
--type code |
Restrict to source code only |
--type docs |
Restrict to documentation only |
--type auto |
Auto-detect intent (default) |
Cross-Project Search (v3.1.4+)
Query across multiple indexed projects:
neuralmind query --projects /repo/a,/repo/b "authentication logic"
Results are tagged with source project and deduplicated by ID.
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
Yes | Path to project root |
question |
Yes | Natural language question about the codebase |
Options
| Option | Default | Description |
|---|---|---|
--json, -j |
False | Output results as JSON |
--trace |
False | (v0.23.0+) Attach a per-layer retrieval trace (see below) |
--trace-verbose |
False | (v0.23.0+) With --trace, keep full candidate/hit lists |
--explain |
False | (v0.39.0+) Human-friendly breakdown of token savings, layers used, top hits, and synapses that fired (implies --trace) |
--relevance |
False | (v0.41.0+) With --json, attach a structured relevance sidecar (per-file, per-node score/synapse-boost/recall + line spans) so a downstream compressor can protect the load-bearing spans (see below) |
Output
Returns:
- Optimized context text for AI consumption
- Token count and breakdown by layer
- Reduction ratio compared to full codebase
- Communities/modules loaded
Retrieval traces (v0.23.0+)
--trace explains why a result came back (PRD 3) — useful when retrieval
surprises you. It records, layer by layer:
- candidates — the raw vector-search pool (ids + scores);
- cluster_scores — per-cluster score with vector-vs-synapse attribution (how much of each cluster’s score came from learned co-activation);
- synapse_boost — individual co-activation boosts;
- hits — the final ranked hits, flagging which were synapse-recalled;
- budget — tokens per layer + reduction ratio.
Plain --trace prints a compact per-layer summary; --json includes the full
trace object (bounded, and path-redactable via the RetrievalTrace API for
sharing in bug reports). Tracing is off by default and zero-overhead. The
daemon’s /query honors trace too, so daemon and direct mode return the same
attribution.
Relevance sidecar (v0.41.0+)
--relevance (with --json) attaches a structured relevance block so a
downstream compressor can tell which spans are load-bearing and must
survive compression. NeuralMind already computes a vector score, a learned
synapse boost, and a recall flag per retrieved node; the sidecar exposes
them as machine-readable metadata keyed by source file (plus best-effort line
spans from the graph), built from the post-boost L3 hits so it reflects the
same signals the rendered context used:
{
"relevance": {
"version": 1,
"files": {
"auth/handlers.py": {
"max_score": 1.02,
"nodes": [
{"node_id": "…", "label": "authenticate", "score": 0.87,
"synapse_boost": 0.15, "recalled": true, "lines": [42, 68]}
]
}
}
}
}
The version field guards the wire shape; the stable files{} / node_id
keys let a tool running after NeuralMind re-associate the signal regardless of
pipeline order. The same block is available over MCP via
neuralmind_query(include_relevance=true). Off by default — query output is
unchanged unless requested. --relevance and --explain both run in direct
mode (they need the full result the daemon’s thin response omits).
Examples
# Basic query
neuralmind query /path/to/project "How does authentication work?"
# JSON output
neuralmind query /path/to/project "What are the main API endpoints?" --json
# Explain the retrieval path (raw trace)
neuralmind query /path/to/project "How does billing work?" --trace
neuralmind query /path/to/project "How does billing work?" --trace --json
# Human-friendly explanation of why this context was chosen (v0.39.0+)
neuralmind query /path/to/project "auth flow" --explain
# → Why this context?
# → Token budget breakdown:
# → L0 identity : 142 tokens
# → L1 summary : 513 tokens
# → L2 communities: 800 tokens
# → L3 search : 980 tokens
# → Total used : 2,435 tokens
# → Est. saved : 47,565 tokens (20.5x reduction)
# → Top search hits (L3, 4 nodes):
# → 0.912 authenticate (auth/handlers.py)
# → 0.887 JWTMiddleware (auth/middleware.py)
Sample Output
=== Query: How does authentication work? ===
[Context]
# Project: MyApp
MyApp is a web application with JWT-based authentication...
[Authentication Module]
The auth module handles user login, token generation, and validation...
[Relevant Code]
- auth/jwt_handler.py: JWT token generation and validation
- auth/middleware.py: Authentication middleware for routes
- models/user.py: User model with password hashing
---
Tokens: 847 | Reduction: 59.0x | Layers: L0, L1, L2, L3 | Communities: [5, 12]
wakeup
Get minimal wake-up context for starting a new conversation.
neuralmind wakeup <project_path> [OPTIONS]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
Yes | Path to project root |
Options
| Option | Default | Description |
|---|---|---|
--json, -j |
False | Output results as JSON |
Output
Returns L0 (Identity) + L1 (Summary) context, typically ~600 tokens, suitable for:
- Starting new AI conversations
- Providing project context to coding assistants
- Initial system prompts
Examples
# Get wake-up context
neuralmind wakeup /path/to/project
# Redirect to file
neuralmind wakeup /path/to/project > context.md
# JSON format
neuralmind wakeup /path/to/project --json
Sample Output
=== Wake-up Context ===
# Project: MyApp
MyApp is a full-stack web application for task management built with React and Node.js.
## Architecture Overview
### Core Components
- **Frontend**: React 18 with TypeScript, Tailwind CSS
- **Backend**: Node.js/Express REST API
- **Database**: PostgreSQL with Prisma ORM
- **Auth**: JWT-based authentication
### Main Modules
1. User Management (users/) - Registration, profiles, settings
2. Task Engine (tasks/) - CRUD operations, scheduling, notifications
3. API Layer (api/) - REST endpoints, middleware, validation
---
Tokens: 412 | Layers: L0, L1
search
Perform direct semantic search across codebase entities.
neuralmind search <project_path> "<query>" [OPTIONS]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
Yes | Path to project root |
query |
Yes | Semantic search query |
Options
| Option | Default | Description |
|---|---|---|
--n |
10 | Maximum number of results |
--json, -j |
False | Output results as JSON |
Output
Returns matching code entities with:
- Entity name and type
- Similarity score (0-1)
- File path
- Community membership
Examples
# Basic search
neuralmind search /path/to/project "authentication"
# Limit results
neuralmind search /path/to/project "database connection" --n 5
# JSON output
neuralmind search /path/to/project "API endpoint" --json
Sample Output
=== Search: authentication ===
1. authenticate_user (function) - Score: 0.92
File: auth/handlers.py
Validates user credentials and returns JWT token
Community: 5 (Authentication)
2. AuthMiddleware (class) - Score: 0.87
File: auth/middleware.py
Express middleware for JWT validation
Community: 5 (Authentication)
3. hash_password (function) - Score: 0.81
File: utils/crypto.py
Securely hashes passwords using bcrypt
Community: 5 (Authentication)
---
Results: 3 | Query time: 45ms
benchmark
Run performance benchmark with sample queries.
neuralmind benchmark <project_path> [OPTIONS]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
Yes | Path to project root |
Options
| Option | Default | Description |
|---|---|---|
--json, -j |
False | Output results as JSON |
--quality |
False | (v0.23.0+) Quality-eval mode — see below |
--suite |
(all) | (v0.23.0+) With --quality, run one suite: python / typescript / go |
--baseline |
— | (v0.23.0+) With --quality, a saved suite JSON to compare against (reports metric deltas) |
--public |
False | (v0.31.0+) Public-benchmark mode — reproduce the honest vs-alternatives comparison on pinned real repos (see below). Ignores project_path (it uses the pinned corpus, not your project) and requires a source checkout — the evals/public harness ships in the repo, not the PyPI wheel |
--repo |
(all) | (v0.31.0+) With --public, scope to one corpus repo: requests / click |
--seeds |
1 |
(v0.31.0+) With --public, the seed count recorded in the report. The pipeline is deterministic (synapse injection off), so variance across seeds is exactly 0 — recorded honestly rather than padded with artificial noise |
--judge |
False | (v0.34.0+) With --public, also run the opt-in answerability arm — each backend answered from its real window by a pinned model (claude-opus-4-8), graded vs. the def-site gold anchor (0–2 + grounded). A clearly-labeled secondary signal. Needs ANTHROPIC_API_KEY; never runs in CI; the recall table is byte-identical with or without it; skips cleanly without a key (see below) |
--judge-out |
bench/public/judge |
(v0.34.0+) With --public --judge, where to write the raw answerability transcripts (question, context tokens, answer, verdict, rationale) |
Output
Comprehensive benchmark report including:
- Token counts for each query type
- Reduction ratios
- Query latencies
- Comparison with full codebase size
Examples
# Run default benchmark
neuralmind benchmark /path/to/project
# JSON output
neuralmind benchmark /path/to/project --json
Quality-eval mode (v0.23.0+)
--quality switches the command from token-reduction benchmarking to
retrieval-quality measurement: does NeuralMind surface the right code,
not just less of it? It scores precision@k, recall@k, MRR, and
answerability over golden query suites (Python / TypeScript / Go — 30
queries with expected-module labels) and exits non-zero if a suite regresses
past its floor, so CI can gate retrieval-affecting changes.
Like neuralmind eval, this is a contributor/CI self-test that runs against
the golden suites shipping with the source repo (the evals/quality/
package), not the installed wheel. The pure metrics live in
neuralmind.quality (from neuralmind import quality).
# Score all golden suites
neuralmind benchmark --quality
# One language, machine-readable
neuralmind benchmark --quality --suite go --json
# Compare against the committed measured baseline (reports metric deltas)
neuralmind benchmark --quality --baseline evals/quality/baseline.json
# Dependency-free validation of the suites + metric math (no embeddings)
python -m evals.quality.runner --selfcheck
Sample (markdown) output — measured on the committed fixtures:
## NeuralMind retrieval-quality eval
| Suite | Queries | MRR | Answerability | Recall@5 | Precision@5 | Gate |
|-------|--------:|----:|--------------:|---------:|------------:|:----:|
| `go` | 10 | 0.950 | 100% | 0.833 | 0.603 | PASS |
| `python` | 10 | 0.900 | 100% | 0.833 | 0.612 | PASS |
| `typescript` | 10 | 0.900 | 100% | 0.800 | 0.562 | PASS |
**Overall: PASS**
The exit code is non-zero if any suite drops below the floors in
evals/quality/harness.py (DEFAULT_THRESHOLDS), so CI can gate on it. The
measured baseline lives at evals/quality/baseline.json; the self-benchmark
workflow runs this on every PR (where real embeddings are available) and posts
the table + baseline deltas as a PR comment.
Public-benchmark mode (v0.31.0+)
--public runs the honest public benchmark: a reproducible, no-cherry-picking
comparison of how much context different approaches put in an agent’s window to
answer a real code question, and whether the objectively-correct file actually
makes it in. It clones real, pinned OSS repos at fixed commit SHAs
(requests @0e322af877, click @874ca2bc1c) and scores cost and
correctness together against strong baselines: full-file paste, ripgrep,
a same-encoder embedding-rag, and neuralmind’s progressive disclosure.
Gold-file recall is an objective def-site oracle — each query’s gold file is
the definition site of a named symbol, verifiable with one rg; there is no
LLM judge. Scoring reuses neuralmind/quality.py verbatim — the same metric
code the CI quality gate runs. Pre-registered queries live in
evals/public/manifest.json; every one is reported, losses included.
# Clone the pinned repos and print the full table
neuralmind benchmark --public
# Scope to one repo
neuralmind benchmark --public --repo click
# Machine-readable output (for CI / further analysis)
neuralmind benchmark --public --json
# Equivalent module entrypoint (from a clone)
python -m evals.public.run
The run is deterministic — synapse injection is OFF (session-dependent
learning can’t be a fixed, reproducible public number; its lift is
measured separately by the synapse A/B eval, tests/benchmark/run.py Phase 2).
This reuses the same NEURALMIND_SYNAPSE_INJECT=0 toggle documented in the
Environment Variables table. Re-running matches the
published table to the token.
Honest headline: against what agents actually do today — paste files or grep
— NeuralMind reaches 79–100% gold-file recall (93.75% mean) at 45–257× fewer
tokens than pasting files, and beats ripgrep on cost on every repo; on
recall it’s ahead on 2 of 4 repos and ties exactly on the other 2. The
benchmark also reports, without hiding it, that a well-tuned vector RAG ties
or beats it at findability too (and cheaper on raw tokens), and that click
is NeuralMind’s weakest repo in the corpus. Full methodology,
results, honest caveats, and “where NeuralMind loses” are published at
docs/benchmarks/public.md;
raw per-query data is committed at bench/public/results.json, and the forkable
runner is .github/workflows/bench-public.yml.
Competitor head-to-head (v0.33.0+)
The benchmark also ships a live, reproducible row vs. codebase-memory-mcp
0.8.1 (the obvious incumbent), on the same pinned repos, questions, def-site
gold, and quality.py scorer, at retrieval depth matched to embedding-rag
(top-8). It lives in a separate module and is off the default run because
it downloads an external binary — invoke it explicitly from a clone:
pip install codebase-memory-mcp==0.8.1 # pins 0.8.1 — on-device embeddings, no API key
python -m evals.public.competitor # prints the competitor row; fails closed without the binary
On reproducible retrieval ranking NeuralMind reaches 100% gold-file recall
and ranks the right file far higher (MRR 0.96 vs 0.23 on requests, 0.60
vs 0.50 on click), while the competitor surfaces the gold file in its top-8
only ~half the time, at an order of magnitude more read cost. Honest framing:
this measures pure retrieval — no LLM agent loop on either side, exactly how we
test NeuralMind’s own search; we used the competitor’s most-favorable
reproducible keyword mapping; and we cite its published LLM-agent numbers (~90%
of an “Explorer” agent; C at 0.58) as-is rather than reproduce them. Per-query
traces and pinned REPRODUCE.md are committed under bench/public/competitor/;
full caveats are in the “Competitor head-to-head” section of
docs/benchmarks/public.md.
Answerability arm — --judge (v0.34.0+)
Gold-file recall measures locating the right file, not answering the question. The opt-in answerability arm adds the answering signal — a clearly-labeled secondary to the recall headline:
ANTHROPIC_API_KEY=… python -m evals.public.run --judge # off by default
For each query it answers from the real context each backend would put in the
window (whole files / retrieved chunks / compact L0–L3 context) using a pinned
model (claude-opus-4-8), constrained to that context only, then a separate
judge call grades the answer against the same def-site gold anchor on a 0–2 scale
plus a grounded flag. It needs ANTHROPIC_API_KEY (and the anthropic
package), never runs in CI, and the recall table is byte-identical with or
without --judge — absent a key it skips cleanly and the recall benchmark still
runs. The answerer prompt, judge rubric, pinned model id, and every raw
transcript are committed under bench/public/judge/ (transcripts written to
--judge-out, default bench/public/judge). Full framing + caveats: the
“Answerability arm” section of
docs/benchmarks/public.md.
Sample Output
=== NeuralMind Benchmark ===
Project: MyApp
Total Nodes: 241
Communities: 93
Estimated Full Codebase: 50,000 tokens
| Query Type | Tokens | Reduction | Latency |
|------------|--------|-----------|----------|
| Wake-up context | 341 | 146.6x | 45ms |
| How does authentication work? | 739 | 67.7x | 187ms |
| What are the main API endpoints? | 748 | 66.8x | 192ms |
| Explain the database models | 812 | 61.6x | 201ms |
|------------|--------|-----------|----------|
| **Average** | **660** | **85.7x** | **156ms** |
---
Benchmark completed in 625ms
probe (v0.27.0+)
Run a retrieval self-probe on your own codebase: does the index actually
find the right file when the agent asks about a symbol? Unlike benchmark
(which measures token reduction) and benchmark --quality (which scores ranking
against committed golden fixtures), probe runs label-free — no hand
annotation — so it works on any built project.
neuralmind probe [project_path] [OPTIONS]
For a deterministic sample of indexed symbols, it queries each one by its
intent — the symbol’s rationale (the docstring text NeuralMind stores as
rationale nodes, e.g. "Raised when the exp claim is in the past"), which
doesn’t contain the symbol name, so it’s a real natural-language → code test
rather than a string match. It asks the backend for code hits directly, then
scores whether the symbol’s source file came back: recall@1/3/5, MRR, and
answerability@k (reusing the neuralmind.quality metrics). Undocumented
symbols fall back to a humanized label, and the report discloses the
rationale-vs-name split so a mostly-fallback run reads as a sanity check, not a
quality score. The most actionable output is the blind-spot list: the sampled
symbols the index couldn’t retrieve from their description — i.e. where an agent
would come up empty. --k must be ≥ 1 and --sample-size ≥ 0 (0 = all).
The idea is borrowed from long-context “needle-in-a-haystack” evals (e.g. S-NIAH in the Recursive Language Models paper): rather than measuring cost, it measures whether the right node still surfaces as the index grows. It is read-only — it never mutates the index or the synapse store.
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
No | Path to project root (default: .) |
Options
| Option | Default | Description |
|---|---|---|
--sample-size |
50 | How many indexed symbols to probe (0 = all) |
--k |
10 | Retrieval depth — a symbol’s file must surface in the top-k |
--seed |
0 | Sampling seed; same seed = same sample, for stable/comparable runs |
--baseline |
— | A saved probe JSON to compare against (reports recall/MRR deltas) |
--json, -j |
False | Output the full report (including every blind spot) as JSON |
Examples
# Probe the current project
neuralmind probe .
# Tighter: the right file must be the #1 hit
neuralmind probe . --k 1
# Save a baseline, then check whether a refactor moved retrieval
neuralmind probe . --sample-size 100 --json > probe-baseline.json
neuralmind probe . --sample-size 100 --baseline probe-baseline.json
Sample Output
Retrieval self-probe — sample_project
Sampled 63 of 64 indexed symbols, retrieval depth k=10
Query source: 51 rationale, 12 label
============================================================
answerability : 98% (file found in top-10)
MRR : 0.789
recall@1/3/5 : 0.667 / 0.905 / 0.968
blind spots : 1
------------------------------------------------------------
Symbols the index couldn't retrieve from their own description (1 total):
- get_me_endpoint() (api/routes.py) query: "GET /api/users/me — requires Authorization: Bearer header"
The Query source line discloses how strong the run was: rationale probes are
real NL→code tests; label probes are a weaker name-based fallback for
undocumented symbols. Because the probe is deterministic per --seed and emits
--json (with a query_sources tally), you can gate CI on a per-repo recall/MRR
floor, or diff two runs with --baseline to catch a retrieval regression before
it ships.
stats
Show statistics about the neural index.
neuralmind stats <project_path> [OPTIONS]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
Yes | Path to project root |
Options
| Option | Default | Description |
|---|---|---|
--json, -j |
False | Output as JSON |
Output
Displays:
- Node counts by type
- Community statistics
- Synapse edge count and total weight
- Embedding model and backend info
Examples
neuralmind stats .
neuralmind stats /path/to/project --json
synapse prune (v3.1.4+)
Remove stale synapses older than N days.
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
Yes | Path to project root |
Options
| Option | Default | Description |
|---|---|---|
--days |
None | Age threshold in days (required) |
--json, -j |
False | Output as JSON |
Output
Number of synapses pruned.
Notes
LTP-protected edges (≥5 activations) are preserved to maintain learned associations.
Examples
# Prune synapses older than 30 days
neuralmind synapse prune . --days 30
# Preview what would be pruned (use stats first)
neuralmind synapse stats .
synapse stats (v3.1.4+)
Detailed synapse diagnostics.
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
Yes | Path to project root |
Output
- Total edges
- LTP-protected count
- Stale (30+ days inactive)
- Dormant (≤1 activation)
- Total weight
Examples
neuralmind synapse stats .
- Embedding information
- Index storage size
- Last build timestamp
Examples
# Basic stats
neuralmind stats /path/to/project
# JSON format
neuralmind stats /path/to/project --json
Sample Output
=== NeuralMind Statistics ===
Project: MyApp
Graph Path: /path/to/project/graphify-out/graph.json
DB Path: /path/to/project/graphify-out/neuralmind_db
## Index Summary
- Total Nodes: 241
- Total Edges: 203
- Communities: 93
- Embedding Dimensions: 384
## Node Types
- Functions: 142 (58.9%)
- Classes: 45 (18.7%)
- Files: 38 (15.8%)
- Database Models: 16 (6.6%)
## Storage
- Index Size: 12.4 MB
- Cache Size: 2.1 MB
## Build Info
- Last Build: 2024-01-15 14:30:22
- Build Duration: 8.3s
- Embedding Model: all-MiniLM-L6-v2
validate (v0.23.0+)
Validate the project’s canonical intermediate representation (IR) — the
versioned, producer-agnostic contract NeuralMind builds from graph.json.
Runs a static schema check; no vector backend required (it never touches
ChromaDB/turbovec).
neuralmind validate [project_path] [OPTIONS]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
No (default .) |
Path to project root |
Options
| Option | Default | Description |
|---|---|---|
--write |
False | (Re)materialize the IR to .neuralmind/index_ir.json — the in-place migration path for a legacy project that predates the IR (no rebuild). |
--json, -j |
False | Output a machine-readable summary (for CI/dashboards) |
What it checks
- errors (exit code
1): dangling edge endpoints, missing endpoints, duplicate node ids, malformed synapse endpoints, unsupported (too-new)ir_version. - warnings: orphaned (edgeless) nodes, unknown node kinds, unknown edge relations, and stale synapses (learned memory pointing at nodes a rebuild removed) — forward-compatibility / hygiene signals.
It also reports the IR contract version, source backend + producer schema
version, coverage (coarse/precise), per-kind / per-language counts, and the
learned-synapse count (folded in backend-free from the SQLite store).
Examples
# Validate the IR for the current project
neuralmind validate .
# Machine-readable summary
neuralmind validate . --json
# Migrate a legacy project's state to the IR in place (no rebuild)
neuralmind validate . --write
Sample Output
IR version: 1
Source backend: neuralmind.graphgen (tree-sitter)
Source schema: v1
Coverage: coarse
Entities: 135 nodes, 185 edges, 18 clusters
Node kinds: document=56, file=13, function=41, symbol=25
Languages: python=135
------------------------------------------------------------
VALID — 0 errors, 0 warning(s).
functionis inferred from the built-in backend’s call-form labels (name()); a producer that doesn’t follow that convention maps those to the genericsymbol. Learned synapses, when a.neuralmind/synapses.dbexists, are folded in and shown in the--jsonsynapsescount.
The IR is also exposed as a public Python API:
from neuralmind import IndexIR, from_graph_json, validate_ir, validate_project.
doctor (v0.12.0+)
Diagnose a project’s NeuralMind setup and print an actionable fix for anything that isn’t wired up. Read-only — it never builds or mutates state.
neuralmind doctor [project_path] [--json]
Arguments:
| Argument | Required | Default | Description |
|---|---|---|---|
project_path |
No | . |
Project root to inspect |
--json, -j |
No | false |
Emit machine-readable JSON |
Checks: code graph, semantic index, backend (v0.22.0+), synapse
memory, MCP server, Claude Code hooks, and query-memory consent. Each reports
ok, warn (optional/learned-over-time), or fail (setup incomplete). The
Backend check reports the configured value (e.g. auto), what it resolves
to (turbovec or chroma), and whether the turbovec stack is installed — so the
per-environment default is never a silent mystery.
Exit codes: 0 when no check failed (warnings allowed), 1 when any
check failed — so you can gate a CI step or an agent’s provisioning on
neuralmind doctor.
Example:
neuralmind doctor .
NeuralMind doctor — /path/to/project
============================================================
[ ok ] Code graph: 1240 nodes at /path/to/project/graphify-out/graph.json
[ ok ] Semantic index: 1240 nodes embedded (turbovec backend)
[ ok ] Backend: turbovec (auto-selected; turbovec stack available)
[warn] Synapse memory: no synapses.db yet (nothing learned)
-> It populates automatically as you query and edit the codebase.
[ ok ] MCP server: MCP SDK importable (neuralmind-mcp ready)
[warn] Claude Code hooks: not installed
-> Install them: neuralmind install-hooks
[ ok ] Query memory: enabled (logging queries for learning)
============================================================
JSON output (--json) is stable for scripting and agent consumption:
{
"status": "fail",
"checks": [
{"name": "Code graph", "status": "fail",
"detail": "not found at /repo/graphify-out/graph.json",
"fix": "Generate it: neuralmind build /repo"}
]
}
eval (v0.14.0+)
Run the faithfulness eval: does NeuralMind’s selected context contain
more gold facts than a matched-budget naive baseline? It self-evaluates
against the committed reference fixture + gold-fact set (which ship with the
source repository), so — like neuralmind benchmark — it’s a quality
self-test, not a per-repo command.
neuralmind eval [project_path] [--json] [--selfcheck] [--onboarding]
Arguments:
| Argument | Required | Default | Description |
|---|---|---|---|
project_path |
No | the gold-set fixture | Project to evaluate |
--json, -j |
No | false |
Emit the report as JSON |
--selfcheck |
No | false |
Validate the gold set + offline scorer only (no retrieval deps) |
--onboarding |
No | false |
Run the onboarding-lift eval instead — committed team memory vs a cold agent (see evals/onboarding/) |
What it reports: the faithfulness delta — mean expected-fact recall of
NeuralMind’s context minus the naive baseline’s, at a matched per-query token
budget — plus grounding rate, contradiction rate, and a per-query breakdown.
A positive delta means smart selection beats dumb truncation at equal token
cost. The default judge is 100% offline; an opt-in LLM-as-judge sits behind
NEURALMIND_EVAL_LLM_JUDGE=1 and is never the default or the CI gate.
What --onboarding reports: the onboarding lift — onboarded − cold
top-k module hit-rate (the share of a query’s expected modules that land in
the ranked top-k retrieval the agent sees), the slice associative recall
re-ranks within. Fact-recall and full-context grounding print as honest
secondaries: at a fixed budget fact-recall is budget-traded (slightly negative
on the tiny fixture) and grounding saturates, so neither is the gated headline.
It’s the same top-k hit-rate signal as the self-benchmark’s Phase-3 A/B.
Requirements: the A/B needs the retrieval stack (chromadb) and a built
index; without them it degrades with an actionable message. --selfcheck
needs neither. From an installed wheel (where the evals/ package isn’t
bundled), run it from a source checkout instead:
python -m evals.faithfulness.runner --run.
ingest-content (v3.4.0+)
Index a corpus of prose — a book’s chapters/, a docs tree, a research
folder — into its own content index. Unlike learn,
which mixes documents into a code project’s graph, ingest-content is built
for corpora that are only content, and for re-running as that corpus grows.
neuralmind ingest-content chapters # index a folder of .md/.txt
neuralmind ingest-content chapters --content-only # skip the code-graph build
neuralmind ingest-content chapters --dry-run # preview files + chunk counts
neuralmind ingest-content chapters --project-path book # pin the index location
neuralmind ingest-content chapters --json # machine-readable result
Where the index goes. The project root is resolved from the nearest
.neuralmind/ or .git marker above the content path, then the cwd. Point
it at book/chapters inside a git repo with no NeuralMind index and it resolves
to the repo root — which is rarely what you want for a book — so it says so and
names the flag:
Note: indexing into /repo — the nearest project marker above /repo/book/chapters
(a git root, with no NeuralMind index of its own).
To keep this corpus self-contained, re-run with --project-path /repo/book/chapters
--project-path pins it explicitly. After the first run the directory carries
its own .neuralmind/index_ir.json, so later runs resolve there on their own.
Skipping the code graph. By default the ingest builds the project’s code
graph first, which for a folder of Markdown is pure cost — and used to require
writing a throwaway _content_seed.py to give the build something to parse.
--content-only skips generating a graph entirely (an existing graph is still
loaded, so code nodes stay in the keyword index) and writes a valid empty IR to
mark the directory as a project. No seed file.
Incremental by default. Every embedded file’s SHA-256 and chunk parameters
are recorded in <project>/.neuralmind/content_manifest.json. A re-run
re-embeds only what changed:
Ingested 1 file(s) → 9 chunks → 9 nodes (33 unchanged, skipped)
Corpus: 34 file(s), 306 chunks
Wall time: 0.6s | Embed time: 0.46s
Chunk ids are positional, so a chapter that shrinks would otherwise leave
orphaned chunks behind. The manifest records each file’s node ids, so shortened
and deleted files have their stale chunks evicted from the index. --force
re-embeds everything; changing --chunk-size/--overlap invalidates the
manifest on its own, since new parameters mean new chunk boundaries.
Progress. On a terminal you get an in-place bar with an ETA. Off one — CI
logs, an agent shell, a redirect — you get plain milestone lines instead, so a
long embed shows movement rather than looking hung. Progress goes to stderr,
so --json on stdout stays parseable. --no-progress (or
NEURALMIND_NO_PROGRESS=1) turns it off.
Timeouts. --timeout N stops cleanly after N seconds: the manifest is
written for what did land, so the next run resumes instead of starting the
corpus over. A timed-out run exits 1 and reports "timed_out": true in JSON.
Files it never reached are not treated as deleted.
| Flag | Description |
|---|---|
--project-path PATH |
Project root to index into. Skips marker resolution. |
--content-only |
Skip the code-graph build; index only the content files. |
--chunk-size N |
Max characters per chunk (default 500, or $NEURALMIND_CHUNK_SIZE). |
--overlap N |
Character overlap between chunks (default 50, or $NEURALMIND_OVERLAP). Must be less than the chunk size. |
--force, -f |
Re-embed every file, ignoring the incremental manifest. |
--dry-run |
Print the files, byte sizes, chunk counts, and per-file status; embed nothing and write nothing. |
--timeout N |
Stop cleanly after N seconds (default unlimited, or $NEURALMIND_INGEST_TIMEOUT). |
--verbose, -v |
Per-file diagnostics on stderr: resolved root, chunk params, per-file timings, evictions. |
--no-progress |
Suppress the progress bar. |
--json, -j |
Machine-readable result on stdout. |
--quiet, -q |
Suppress human progress output. |
JSON output:
{
"success": true,
"project_path": "/repo/book",
"content_only": true,
"incremental": true,
"files_processed": 1,
"files_skipped": 33,
"files_total": 34,
"total_chunks": 306,
"chunks_embedded": 9,
"total_nodes": 9,
"orphans_removed": 0,
"chunk_size": 500,
"overlap": 50,
"wall_time_seconds": 0.6,
"embed_time_seconds": 0.46,
"timed_out": false,
"errors": []
}
--dry-run --json returns a different shape: dry_run: true, a files array
of {file, path, bytes, chunks, status}, and chunks_would_embed.
Exit codes: 0 success · 1 one or more files failed, or the run timed
out · 2 invalid chunk parameters.
Check the result any time with neuralmind status <path>.
learn — document ingestion (v1.11.0+)
Ingest PDFs, Markdown, and plain text into the knowledge graph alongside code. The deprecated no-op has been repurposed as a first-class ingestion command.
neuralmind learn <file> # ingest single file
neuralmind learn <directory> # ingest all supported files
neuralmind learn --type pdf guide.pdf # type hint (auto/pdf/markdown/text)
neuralmind learn --json report.md # output stats as JSON
What it does:
- Parses PDF/Markdown/text into
ContentNodeobjects with chunking - Embeds chunks into the same vector space as code
- Deduplicates on re-ingestion (identical content → 0 new nodes)
- Guards against path traversal, binary files, size bombs (>10MB)
Notes:
- Ingested documents appear in
neuralmind queryresults alongside code - Learning from usage (synapses) still happens automatically via the synapse layer
- For compliance/tagged ingestion, use
neuralmind learn --type cmmc
learn (deprecated, v0.25.0 — pre-v1.11.0)
This section describes the pre-v1.11.0 behavior, replaced by the command above. cooccurrence reranker this command used to populate was removed. The command now prints a deprecation notice and exits 0, so existing scripts and CI that call it keep working unchanged.
neuralmind learn <project_path> # prints a deprecation notice, exits 0
Learning is now handled entirely by the synapse layer, which learns continuously and automatically from queries, edits, and tool calls — no manual step, and edges decay instead of going stale. A 2×2 A/B on the benchmark fixture showed the old reranker added 0.0 points to top-k hit rate while the synapse layer alone moves it (+3.5 to +14 points across runs; CI gates the direction, not the magnitude).
To see what’s been learned, use neuralmind stats or
neuralmind memory inspect. For the full rationale
and migration notes, see the
v0.25.0 release notes.
self-improve status (v0.26.0+)
Show the self-improvement engine’s current selector-tuning state. Read-only — it never writes and never runs the tuner; it only reports what the tuner has done.
neuralmind self-improve status [project_path] [--json]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
No (default .) |
Path to project root |
Options
| Option | Default | Description |
|---|---|---|
--json, -j |
off | Machine-readable JSON output (adds autotune_enabled) |
What it reports
l2_recall_k— the current (possibly tuned) L2 recall depth, i.e. how many community summaries a query surfaces. Default3, clamped to[2, 6].l2_recall_k_tuned_at— ISO timestamp of the last change, ornever.- query-event count + warm-up state (the tuner holds until 50 query events accumulate).
- the windowed
re_query_ratethe tuner reads. - whether autotune is enabled (the
NEURALMIND_SELECTOR_AUTOTUNEflag).
$ neuralmind self-improve status .
Project: my-project
Autotune enabled: True (NEURALMIND_SELECTOR_AUTOTUNE)
l2_recall_k: 4
Last tuned at: 2026-06-12T17:58:10+00:00
Query events logged: 132 (warmed up: True)
Query events in tuning window: 41
re_query_rate: 0.512
The tuner itself runs only when NEURALMIND_SELECTOR_AUTOTUNE=1 — under Claude
Code it ticks once per session from the SessionStart hook (after the synapse
decay tick); the tuned value is then threaded into the selector at build time so
ordinary queries (CLI or MCP) use the adapted recall depth. With the flag unset
the hot path does zero extra I/O and the selector keeps its hard-coded
default. The tuner is single-step, windowed, hysteretic, clamped, and fail-open;
see the v0.26.0 release notes
and evals/self_improvement/PLAN.md for the full design.
next (v0.11.0+)
Predict what typically follows a node (file path or node id) in the
learned directional transition graph. Pairs with the
record_sequence calls the file watcher runs automatically on every
batched flush.
neuralmind next <project_path> <from_node> [--n 5] [--namespace NAME] [--json]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
Yes | Path to project root |
from_node |
Yes | Source node — usually a file path; can be any string the transition recorder has seen |
Options
| Option | Default | Description |
|---|---|---|
--n |
5 |
Top-N successors to return |
--namespace |
merged | (v0.24.0+) Read one memory namespace at raw weights (e.g. branch:feature-x). Default is the merged view: active namespace 1.0× + personal 0.8× + shared 0.5× |
--json, -j |
False | Output as JSON |
Examples
# What do I usually edit after the auth handlers?
neuralmind next . src/auth/handlers.py
# JSON for scripting
neuralmind next . src/auth/handlers.py --n 10 --json
Sample output:
After src/auth/handlers.py:
45.2% tests/test_auth.py
28.4% src/auth/middleware.py
12.1% docs/auth.md
8.3% src/auth/__init__.py
6.0% src/main.py
The same capability is exposed via MCP as neuralmind_next_likely
and via Python as SynapseStore.next_likely(from_node, top_k=5). The
file watcher must have been running at some point for this to return
results — fresh installs need a few sessions before the transition
graph accumulates signal.
memory (v0.24.0+)
Namespace-level controls over the learned synapse memory (PRD 4). Every
learned association carries a namespace — personal (default; all
pre-v0.24 memory migrates here losslessly), shared (imported team
baseline), branch:<name> (per-git-branch, detected automatically), and
ephemeral (session scratch, cleared at session boundaries). All four
subcommands work without a built index — the store is stdlib SQLite.
neuralmind memory inspect [project_path] [--namespace NAME] [--json]
neuralmind memory reset [project_path] --namespace NAME [--json]
neuralmind memory export [project_path] [--namespace NAME] [-o FILE]
neuralmind memory import <file> [--project-path PATH] [--namespace NAME] [--json]
neuralmind memory publish [project_path] [--json]
Subcommands
| Subcommand | What it does |
|---|---|
inspect |
Contribution by namespace — edges, total weight, transitions, nodes — plus the active namespace and schema version. Also folded into neuralmind stats. |
reset |
Clear one namespace (--namespace is required). The project index and every other namespace are untouched — the surgical alternative to a full retrain. |
export |
Write one namespace as a portable, versioned JSON bundle reusing the IR’s IRSynapse shape. Defaults to the active namespace; -o writes a file, otherwise stdout. |
import |
Validate a bundle (format + version + entries) and merge it into a target namespace (default: the bundle’s own). Merging keeps the MAX of weight/count per edge, so re-importing the same bundle is idempotent. A malformed bundle is rejected wholesale — never partially imported. |
publish (v0.30.0) |
Team memory. Export the project’s learned memory (personal + shared, MAX-merged) to a committed bundle at the repo root, .neuralmind-team-memory.json. Commit it, and every teammate’s agent inherits it once into shared on its next SessionStart/build (content-hash-gated, off-switch NEURALMIND_TEAM_MEMORY=0). |
Examples
# What has the agent learned, and where does it live?
neuralmind memory inspect .
# A feature branch merged — drop exactly its memory
neuralmind memory reset . --namespace branch:feature-x
# Ship a team baseline to a new teammate (ad-hoc bundle)
neuralmind memory export . --namespace personal -o team-baseline.json
neuralmind memory import team-baseline.json --namespace shared
# Team memory (v0.30.0): commit once, teammates inherit automatically
neuralmind memory publish .
git add .neuralmind-team-memory.json && git commit -m "publish team memory"
# teammates: their next `neuralmind build` / Claude Code session inherits it
How the active namespace is resolved
NEURALMIND_NAMESPACE env var → memory_namespace: in
neuralmind-backend.yaml → branch:<name> when the repo is on a
non-default git branch (best-effort git rev-parse, 3s timeout) →
personal. A non-repo, detached HEAD, or missing git all degrade safely
to personal. Long-lived processes (the daemon, the MCP server) detect a
git checkout between writes via a cheap .git/HEAD fingerprint and
re-resolve automatically — no restart needed.
Merged-read weighting
Recall, next, and stats default to a merged view with explicit,
published constants (neuralmind/synapses.py):
merged_weight = 1.0 × active + 0.8 × personal + 0.5 × shared
(W_BRANCH) (W_PERSONAL) (W_SHARED)
On the default branch the active namespace is personal (read at
1.0×), so behavior is identical to pre-namespace releases. Per-namespace
decay: shared is sticky, personal/branch:* decay at the standard
rates, ephemeral fades fast with no LTP floor. Traced queries
(query --trace) attribute each synapse boost to its namespace via
namespace_contribution.
skeleton
Print a compact graph-backed view of a file — functions, rationales, and call graph — without loading the full source.
neuralmind skeleton <file_path> [--project-path .] [--json]
Arguments
| Argument | Required | Description |
|---|---|---|
file_path |
Yes | Path to the source file (absolute or project-relative) |
Options
| Option | Default | Description |
|---|---|---|
--project-path |
. |
Project root directory |
--json, -j |
False | Output as JSON |
Examples
# Skeleton for a file in the current project
neuralmind skeleton src/auth/handlers.py
# Skeleton with explicit project root
neuralmind skeleton src/auth/handlers.py --project-path /path/to/project
# JSON output
neuralmind skeleton src/auth/handlers.py --json
structural (v0.42.0+)
Show how a symbol is wired into the codebase from the static code graph —
its callers, callees, base/sub classes, and importers. These are the precise
structural edges (calls, inherits, imports_from) that graphify
extracts, distinct from the learned synapse graph. Use it before editing a
function’s signature (find every caller) or a class (find overrides), or pass
--blast-radius for the transitive set of code a change would affect.
neuralmind structural <symbol> [--relation calls|inherits|imports|contains|all] \
[--blast-radius] [--depth N] [--project-path .] [--json]
Arguments
| Argument | Required | Description |
|---|---|---|
symbol |
Yes | Symbol name or natural-language description; resolved to the closest code node |
Options
| Option | Default | Description |
|---|---|---|
--relation |
(all default views) | Limit to one relation: calls, inherits, imports, contains, or all |
--blast-radius |
False | Show the transitive reverse-dependency set (what a change would affect) |
--depth |
2 |
Blast-radius hop depth |
--project-path |
. |
Project root directory |
--json, -j |
False | Output as JSON |
Examples
# Who calls / what does this call / what does it inherit?
neuralmind structural "create user"
# Just the callers, via the calls relation
neuralmind structural authenticate_user --relation calls
# Blast radius before a risky refactor
neuralmind structural "charge customer" --blast-radius --depth 2
# Machine-readable output for scripting
neuralmind structural UserService --json
Example output:
## Structural neighbors of users_crud_create_user
### Callers (1)
- create_user_endpoint() — routes.py
### Callees (2)
- get_connection() — connection.py
- User — crud.py
The equivalent MCP tool is neuralmind_structural_neighbors (with a
blast_radius boolean). Both return real graph node ids, so they compose
with neuralmind_synaptic_neighbors.
impact (v0.52.0+, originally v0.47.0)
A friendlier-named, richer-output sibling of structural --blast-radius —
same underlying structural index, same traversal, but each dependent row
carries which hop and which relation (calls/inherits/
imports_from/implements) connects it, not just its id. Use before
renaming, re-signing, or deleting a symbol to see everything a change would
touch, in one command instead of a boolean flag on a differently-named one.
neuralmind impact <symbol> [--depth N] [--project-path .] [--json]
Arguments
| Argument | Required | Description |
|---|---|---|
symbol |
Yes | Symbol name, natural-language description, or exact node id |
Options
| Option | Default | Description |
|---|---|---|
--depth |
1 |
How many hops of transitive dependents to include |
--project-path |
. |
Project root directory |
--json, -j |
False | Output as JSON |
Examples
neuralmind impact hash_password
neuralmind impact "the login handler" --depth 2
neuralmind impact UserService --json
Example output:
Impact of auth_handlers_authenticate_user (semantic match) — depth 2:
h1 calls login_endpoint() — routes.py
1 dependent(s).
--json returns {symbol, depth, relations, resolution, resolved_node,
dependents, count}, where resolution is "exact" (symbol was a literal
node id), "semantic" (resolved via the closest embedding match), or
"none". The equivalent MCP tool is neuralmind_impact.
last (v0.10.0+)
Print the most recent Bash output the PostToolUse hook cached, so an agent can recover the dropped middle without re-running the command.
Every time the compress-bash hook fires, it stashes the raw
pre-compression stdout/stderr to
<project>/.neuralmind/last_output.json (single-slot, 2 MB cap,
atomic temp-file + rename writes). neuralmind last surfaces it.
neuralmind last [project_path] [--json]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
No | Project root containing .neuralmind/last_output.json (default: current directory) |
--json, -j |
No | Emit the full payload as JSON (timestamp, command, exit code, stdout, stderr) |
Examples
# Human-readable: what the agent would have seen pre-compression.
neuralmind last
# Full JSON payload — useful for scripted recovery flows.
neuralmind last --json
# When no cache exists yet (no Bash call has fired the hook).
neuralmind last
# → "No cached output found at <path>. Run a Bash tool call through Claude Code first…"
# → exits with status 1
Exit codes
| Code | Meaning |
|---|---|
0 |
Cache present and printed |
1 |
No cache exists (no recent Bash call) |
When to use
| Scenario | Recovery cost without last |
With last |
|---|---|---|
Inspecting compressed npm test middle |
Re-run (~28s) | Free lookup |
| Reading dropped log lines from a non-deterministic API call | Re-run + likely different output | Free lookup, identical bytes |
| Reading dropped output from a destructive command | Re-run impossible | Free lookup |
Credential redaction (v3.5.0+). Secrets are stripped before the cache is
written, so a value shown as [REDACTED:<kind>] was never stored on disk. The
header lists which kinds were removed:
# cached: 2026-08-24T13:47:44 exit=0
# command: printenv
# redacted: anthropic-api-key (re-run the command to see real values)
ANTHROPIC_API_KEY=[REDACTED:anthropic-api-key]
Re-run the command yourself if you need the real value. Disable with
NEURALMIND_OUTPUT_REDACT=0 (not recommended — the cache lives in a plaintext
file inside your project).
install-hooks
Install or uninstall Claude Code lifecycle hooks. As of v0.4.0 this registers four event blocks (idempotent — re-running only updates the NeuralMind block, leaving any user hooks untouched):
| Event | What runs | Purpose |
|---|---|---|
PostToolUse |
Read/Bash/Grep compressors; Edit/Write reuse feedback (v0.41.0) | Token reduction on tool output; feed the reuse-vs-rewrite signal back into the synapse layer (edit-activity, off-switch NEURALMIND_REUSE_FEEDBACK=0) |
SessionStart (v0.4.0) |
synapse decay() + memory export |
Age unused synapses; surface learned associations to Claude Code’s auto-memory |
UserPromptSubmit (v0.4.0) |
Spreading activation from prompt | Inject ranked synapse neighbors as additionalContext |
PreCompact (v0.4.0) |
normalize_hubs() |
Prevent runaway hub nodes before context compaction |
neuralmind install-hooks [project_path] [--global] [--uninstall]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
No | Project root (default: current directory). Ignored when --global is set |
Options
| Option | Default | Description |
|---|---|---|
--global |
False | Install hooks in ~/.claude/settings.json (all projects) |
--uninstall |
False | Remove NeuralMind hooks while preserving other tools’ hooks |
Examples
# Install hooks for current project
neuralmind install-hooks .
# Install hooks globally
neuralmind install-hooks --global
# Uninstall project hooks
neuralmind install-hooks --uninstall
# Uninstall global hooks
neuralmind install-hooks --uninstall --global
Bypass temporarily:
NEURALMIND_BYPASS=1 claude-code ...
install-mcp (v0.19.0+)
Register the NeuralMind MCP server (neuralmind-mcp) with one or more AI coding
agents. Auto-detects installed clients and merges a neuralmind entry into each
client’s mcpServers config without clobbering your other servers
(idempotent — re-running is a no-op).
neuralmind install-mcp [project_path] [--client NAME] [--all] [--print]
Clients & config locations
| Client | Scope | Config file |
|---|---|---|
claude-code (default) |
project | .mcp.json |
cursor |
project | .cursor/mcp.json |
claude-desktop |
user | platform claude_desktop_config.json |
cline |
user | VS Code cline_mcp_settings.json |
vscode |
user | VS Code settings.json (mcp.servers key, requires VS Code 1.99+) |
Options
| Option | Default | Description |
|---|---|---|
--client |
claude-code |
Which single client to register with |
--all |
False | Register with every detected client (auto-detection) |
--print |
False | Print the config snippet to paste manually; write nothing |
Examples
# Register with Claude Code for this project (writes .mcp.json)
neuralmind install-mcp
# Register with every agent installed on this machine/project
neuralmind install-mcp --all
# A specific client
neuralmind install-mcp --client cursor
# Just show me the snippet
neuralmind install-mcp --print
Restart the client after registering so it picks up the new server. The agent
then exposes NeuralMind’s MCP tools (wakeup, query, search, skeleton,
build, stats, …).
init-hook
Install (or update) two Git hooks, both idempotent and both appended to any existing hook script rather than overwriting it:
post-commitrebuilds the neural index automatically after every commit.pre-commit(v3.2.0+) runsneuralmind drift . --stagedover the staged diff — the commit-time drift guard described underdriftbelow.
neuralmind init-hook [project_path] [--no-drift] [--strict]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
No | Project root (default: current directory) |
--no-drift |
No | Skip installing the pre-commit drift guard; post-commit rebuild only |
--strict |
No | Make the installed drift guard block commits instead of warning |
Examples
# Install both hooks (drift guard warns, never blocks)
neuralmind init-hook .
# Install both hooks, with drift blocking the commit
neuralmind init-hook . --strict
# Install only the post-commit rebuild, no drift guard
neuralmind init-hook . --no-drift
drift (v3.2.0+)
Flag changed symbols that skip a pattern their peers share — the commit-time
half of the cohesion outlier check (NEURALMIND_SYNAPSE_OUTLIERS, see
Environment Variables), which runs the same
consensus math at query time instead of diff time. Reads a git diff, maps the changed lines onto graph symbols, groups each
changed symbol with its siblings in the same file or class, and asks whether
the symbol you just touched omits an association a strong majority of that
group makes (e.g. nine of ten *_endpoint handlers call verify_session()
and the tenth doesn’t).
Only symbols in the diff are ever reported — pre-existing outliers
elsewhere in the graph are silently ignored, so the check never blames a
commit for drift it didn’t introduce. Warn-only and exit-0 by default so it
is safe to wire into pre-commit; --strict makes it exit non-zero.
neuralmind drift [project_path] [--staged] [--diff BASE] [--strict]
[--cohesion N] [--min-peers N] [--max-findings N]
[--no-refresh] [--json]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
No | Project root (default: current directory) |
--staged |
No | Check staged changes against HEAD — what pre-commit sees |
--diff BASE |
No | Diff the working tree against BASE instead of HEAD |
--strict |
No | Exit non-zero when drift is found (default: warn only) |
--cohesion N |
No | Fraction of a peer group that must share an association before a dissenter is flagged (default: 0.6) |
--min-peers N |
No | Minimum peers required for a peer group to be judged (default: 3) |
--max-findings N |
No | Cap on reported findings (default: 10) |
--no-refresh |
No | Skip re-parsing changed files; judge against the graph exactly as last built |
--json |
No | Output JSON |
Examples
# What a pre-commit hook runs
neuralmind drift . --staged
# Check everything since a branch diverged from main
neuralmind drift . --diff main
# Be stricter about what counts as consensus, and block on it
neuralmind drift . --staged --cohesion 0.75 --strict
## NeuralMind drift check (warning) — 1 finding(s)
- api/routes.py:67 — `delete_me_endpoint()` skips `verify_session()`, which 3 of its 9 peers (33%) use. Confirm this is deliberate.
Warning only — the commit proceeds. Use --strict to block on drift.
Requires a built graph (neuralmind build .) — without one, drift reports
“No code graph found” and exits 0 rather than failing the commit. When
tree-sitter is installed (the graphgen optional extra), the graph is
transparently refreshed for just the changed files before judging, so a
brand-new function in the diff is visible even though the persisted index
predates it; pass --no-refresh to skip that and judge against the index
exactly as it was last built. Stdlib-only otherwise, same as
neuralmind/cohesion.py — no ChromaDB or embedder work.
compliance (v3.1.4+)
Scan a project for compliance annotations written in comments or prose,
and reinforce a synapse between the annotated code node and the control it
names — so neuralmind query "what implements CC6.1" can find it later.
neuralmind compliance [project_path] [--watch] [--json]
| Flag | Default | Effect |
|---|---|---|
project_path |
. |
Project root to scan |
--watch |
off | Stay resident; re-detect as files change and reinforce synapses live |
--json, -j |
off | Machine-readable output |
$ neuralmind compliance .
Found 27 compliance annotations across neuralmind:
[ SOC2] CC6.1
Logical access controls.
docs/compliance/ACCESS_CONTROL.md
[ NIST] AC-1
Access control policy
neuralmind/compliance_matcher.py
Annotation syntax — each framework needs its own marker
This is the part that bites people. A control id alone never matches. Every framework requires a marker, on the same line as the id:
| Framework | Marker required | Example |
|---|---|---|
| CMMC | optional — the id shape is unambiguous | // AC.L2-3.1.1: Authorized access control |
| NIST SP 800-53 | NIST or NIST SP 800-53 |
# NIST AC-1: Access control policy |
| SOX ITGC | optional — the ITGC- prefix is unambiguous |
# ITGC-CM-001: Change approved via CAB |
| HIPAA | optional — the 164. id shape is unambiguous |
/* 164.312(a)(1): Access control required */ |
| SOC 2 | SOC 2 or Compliance: |
**SOC 2 Control:** CC6.1 — Logical access |
| ISO 27001 | ISO 27001 or Compliance: |
# ISO 27001 A.9.2.1: User registration |
Two consequences worth stating plainly:
Compliance:is a SOC 2 / ISO 27001 marker, not a universal one.# Compliance: AC-1: Access control policymatches nothing — NIST needs its own prefix.- A bare
CC6.1in a prose table does not match. The marker may sit up to 32 characters before the id on the same line, which is what makes**SOC 2 Control:** CC6.1work, but a control id on its own is indistinguishable from a version string and is ignored. This tightening landed in v3.3.0 after the looser pattern matchedv0.13,M13.5(an SVG path command) andpython3.10as Trust Services Criteria.
What gets scanned
Code and prose: .py .js .jsx .ts .tsx .go .java .rb .php .cs .c .cpp
.h .rs .md .mdx .rst .txt. Skipped: .git, node_modules, .venv,
venv, __pycache__, .next, out, htmlcov, .neuralmind.
(Before v3.3.1 the CLI read only source files, so annotations kept in markdown — the usual place for a policy document — were invisible to this command even though the matcher supported them.)
Showing an annotation without becoming evidence
Documentation, tests and marketing copy have to show what an annotation
looks like. Before v3.4.1 every one of those examples was counted as a real
annotation — on this repository the scan reported 37 controls, 25 of which
were syntax samples in the very pages that document the syntax, and all 37
flowed into neuralmind export --controls, which users submit as audit
evidence.
Two opt-out markers fix that. Neither is a comment syntax of its own — put
the text anywhere a given file lets you put text (an HTML comment in
markdown, a # or // comment in code, prose in a docstring):
| Marker | Scope | Use it when |
|---|---|---|
neuralmind:example-file |
the whole file, wherever it appears | the file is about the syntax — a reference page, a test fixture |
neuralmind:example |
the one line it sits on | a single sample inside a file whose other annotations are real |
<!-- neuralmind:example-file — annotations here are syntax examples, not evidence. -->
# CLI Reference
help="e.g. # NIST AC-1: Access control policy", # neuralmind:example
The file-level marker is checked before any pattern runs, so an opted-out file costs nothing to scan. The line-level marker is tested against the whole line the control id sits on, not the start of the match.
Both markers are inert everywhere else — nothing else in NeuralMind reads them, and a file carrying one still indexes, embeds and queries normally.
ci-check (v3.1.4+)
Run the same detection against a git diff instead of the whole tree, so a pipeline can report which compliance-annotated code a change touches.
neuralmind ci-check [project_path] [--framework NAME] [--diff REF] [--fail-on-warning] [--json]
| Flag | Default | Effect |
|---|---|---|
--framework |
all |
cmmc, nist, sox, hipaa, iso, soc2, or all |
--diff |
HEAD |
Git ref to diff against; HEAD means uncommitted changes |
--fail-on-warning |
off | Exit non-zero when warnings exist |
--json, -j |
off | Structured output suitable for a PR comment |
$ neuralmind ci-check . --framework soc2 --diff HEAD~1
NeuralMind CI Compliance Check
Framework: SOC2
Base ref: HEAD~1
Changed files: 3
No compliance annotations affected by this diff.
--framework accepts the friendly spellings (sox → SOX ITGC, iso →
ISO 27001, soc/soc 2 → SOC2). (Before v3.3.1 the flag was echoed in
the header but never applied — findings from every framework were reported
regardless of what you passed.)
export (v3.1.4+)
Write NeuralMind state out as an auditor-ready artifact.
neuralmind export [project_path] [--format csv|pdf] [--controls] [--nodes] [--output FILE]
| Flag | Default | Effect |
|---|---|---|
--format |
csv |
csv or pdf |
--controls |
off | Compliance-control-to-code mappings (CSV only) |
--nodes |
off | All graph nodes with metadata (CSV only) |
--output |
neuralmind_export.csv / .pdf |
Output path |
--report |
ssp |
Report type for PDF export |
--controls is the flag people submit as evidence, so it inherits the
annotation rules above exactly: what neuralmind compliance finds is what
lands in the CSV, including its label column.
watch (v0.4.0+)
Run the file activity → synapse co-activation daemon in the foreground. Edits to project files are debounced into batches and fed into the synapse store, so the v0.4.0 brain-like layer keeps learning even when no query runs. Periodic decay ticks age unused weights without manual intervention. Stops cleanly on Ctrl-C.
neuralmind watch [project_path] [--debounce SECONDS] [--decay-interval SECONDS] [--quiet] [--reindex]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
No | Project root (default: current directory) |
Flags
| Flag | Default | Description |
|---|---|---|
--debounce |
0.75 |
Seconds to coalesce rapid edits into one co-activation batch |
--decay-interval |
600 |
Seconds between decay ticks; 0 disables periodic decay |
--quiet |
off | Suppress per-batch logging (still prints final summary on stop) |
--reindex |
off | (v0.18.0+) Incrementally re-index edited files into the built-in graph as they change — re-parses just those files and re-embeds only their nodes (unchanged files are skipped). Built-in backend only; needs the retrieval stack in the watch process. |
Examples
# Always-on learning for the current project
neuralmind watch &
# Background it and only log the final summary
neuralmind watch /path/to/repo --quiet &
# Disable periodic decay (decay only runs from SessionStart hook)
neuralmind watch . --decay-interval 0
# Keep the index live as you edit (incremental re-index, v0.18.0+)
neuralmind watch . --reindex
Notes
- Backed by
watchdogwhen present, with a polling fallback when not. No mandatory new dependency. - Pairs with
neuralmind install-hooks— the watcher learns from edits, the lifecycle hooks learn from queries and tool calls, and the same<project>/.neuralmind/synapses.dbstore is the single source of truth. - For “always on” across reboots, wrap in systemd, launchd, or tmux. NeuralMind deliberately doesn’t self-daemonize.
serve (v0.5.4; live feed v0.6.0+)
Start the graph-view UI — a local, dependency-free, Obsidian-style force-directed graph over the same index and synapse store your AI agent queries. v0.6.0 made the canvas live: synapse + file events stream to the browser over SSE, affected nodes pulse, a sidebar log shows recent events. Stops cleanly on Ctrl-C.
The server binds to 127.0.0.1 by default and prints a per-session auth-token URL on startup; pass that URL to the browser so untrusted local processes can’t read your graph.
neuralmind serve [project_path] [--port PORT] [--no-browser] [--editor EDITOR] [--no-auth]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
No | Project root (default: current directory) |
Flags
| Flag | Default | Description |
|---|---|---|
--port |
8787 |
TCP port to bind to |
--no-browser |
off | Don’t auto-open a browser tab on startup |
--editor |
$EDITOR |
Editor command used by the “Open in editor” button — code, code -n, cursor, vim, subl, idea, etc. |
--no-auth |
off | Disable the per-session auth token. Only use on a trusted host. |
Examples
# Run against the current project
neuralmind serve .
# Custom editor for the "open in editor" button
neuralmind serve . --editor "code -n"
# Pick a different port and skip the browser
neuralmind serve . --port 9000 --no-browser
# Skip auth for a kiosk / trusted local host
neuralmind serve . --no-auth
Live activity feed (v0.6.0+)
The canvas updates in real time as the brain works:
- Synapse events — every
SynapseStore.reinforce()call publishes asynapseevent over the in-process event bus; the affected pair of nodes pulse on the canvas. - File activity events — every coalesced edit batch from the
neuralmind watchdaemon (or from Claude Code’sPostToolUsehooks) publishes afile_activityevent; affected nodes pulse. - Sidebar log — the most recent ~80 events render as a scrolling feed with timestamps. Click an entry to focus the corresponding node on the canvas.
Cross-process activity bridge (v0.6.0+)
When serve and the activity source live in different processes —
a separate neuralmind watch daemon, a Claude Code session — each
event_bus.publish() call also appends a JSON line to
<project>/.neuralmind/events.jsonl. The serve process tails that
file in a background thread and re-emits anything it didn’t
originate. Net result: one canvas, all processes, no IPC complexity.
Behaviour:
NEURALMIND_EVENT_LOG=0disables the writer (in-process feed still works).- The tailer is best-effort. If the file disappears or rolls, the next event re-creates it.
- The bus stays the primary path. The JSONL is a fallback, not a queue.
Notes
- Read-only over HTTP. Edits to nodes/synapses still go through the regular CLI and MCP tools; the UI only inspects.
- The
/api/openendpoint launches$EDITORagainst an allowlist pre-computed from the graph’ssource_fileset, so a tampered client can’t trick the server into opening arbitrary paths. - All assets in
neuralmind/web/(HTML, JS, CSS) are read-only at runtime; the server doesn’t generate any of them. - Graph payload is cached per-session in
_Handler._graph_cache; any endpoint touching graph state respects_graph_lock. - Vanilla-JS frontend, stdlib-only HTTP server, no CDN. Safe to run behind a firewall.
daemon (v0.23.0+)
Manage the local NeuralMind daemon (experimental — PRD 5). The daemon holds
each project’s state warm so repeated queries skip cold backend init. CLI
read commands (query, stats) prefer it automatically when it’s running and
fall back to direct mode otherwise.
neuralmind daemon {start|stop|restart|status} [OPTIONS]
Actions
| Action | Description |
|---|---|
start |
Launch the daemon in the background (writes a discovery file). No-op if already running. |
stop |
Ask the running daemon to shut down gracefully; clears stale discovery. |
restart |
Stop (if running) then start. |
status |
Show pid, uptime, warm projects, and active jobs (exit 3 if not running). |
Options
| Option | Default | Description |
|---|---|---|
--host |
127.0.0.1 |
Host to bind (loopback) |
--port |
8787 |
Port to bind |
--foreground |
False | Run in the foreground instead of detaching (start/restart) |
--json, -j |
False | Machine-readable status output |
Behavior
- One per-user daemon, many projects. A project registry initializes each
NeuralMindonce and reuses it; a per-project lock serializes build/query/watch so they can’t corrupt the index or synapse store; slow builds run as background jobs. - Auto-preference + fallback.
neuralmind query/statsuse the daemon when reachable (output markedvia: daemonin--json), else run directly. Force direct mode withNEURALMIND_NO_DAEMON=1. - Crash-safe discovery. A stale discovery file (dead pid / unreachable) is cleaned up automatically, so a crashed daemon never wedges the CLI.
- Shared API. The daemon speaks one transport-agnostic contract
(
health/status/query/search/stats/build/validate/jobs); theneuralmind-daemonconsole script runs it directly. Token-guarded even on loopback.
# Warm daemon, then fast repeat queries
neuralmind daemon start
neuralmind query . "how does auth work?" # served warm (via: daemon)
neuralmind daemon status --json
neuralmind daemon stop
savings (v0.39.0+)
Show cumulative token savings from the local query event log. Verifies the 12-50× claim against your own real usage rather than trusting the demo.
neuralmind savings [project_path] [OPTIONS]
Options
| Option | Default | Description |
|---|---|---|
--global |
False | Show savings across ALL projects (reads the global event log at ~/.neuralmind/memory/) |
--json, -j |
False | Emit structured JSON output |
--cost |
False | (v0.45.0+) Also show estimated dollar savings, priced on input tokens ($/MTok) |
--model |
claude-opus-4-8 |
(v0.45.0+) Pricing model for --cost — choices come from the built-in input-price table (Claude / GPT / Gemini) |
--queries-per-day |
100 | (v0.45.0+) Assumed daily query volume behind the --cost daily/monthly projection |
Examples
# Show project-level savings
neuralmind savings .
# → NeuralMind token savings — my-project
# → Queries logged : 47
# → Avg reduction : 38.2x
# → Tokens actually used : 83,140
# → Est. cost without NM : 2,350,000
# → Tokens saved : 2,266,860
# Global savings across all projects
neuralmind savings --global
# JSON for dashboards or scripting
neuralmind savings . --json
# Dollar savings at claude-opus-4-8 input pricing (v0.45.0+)
neuralmind savings . --cost
# → Dollar savings — claude-opus-4-8 @ $5.0/MTok input
# → Cost without NM : $ 11.75
# → Cost with NM : $ 0.42
# → Saved : $ 11.33
# → Projected : $24.12/day · $723.47/month (at 100 queries/day)
# Price against a different model and daily volume
neuralmind savings --global --cost --model gemini-2.5-pro --queries-per-day 250
# JSON gains a "dollar_savings" block when --cost is set
neuralmind savings . --cost --json
The dollar figures are estimates anchored to the same 50,000-tokens-per-query
baseline as the token report, priced on input tokens only — retrieval
decides which input tokens ship, so output pricing never enters the math.
Prices are a 2026-07 snapshot (MODEL_PRICING_PER_MTOK in neuralmind/memory.py).
Only the with-NeuralMind cost is measured from logged tokens; without-NM
(and therefore saved / projected) is estimated from the fixed baseline, so
those figures are marked (est) in the human output. The JSON dollar_savings
block makes this machine-readable too: estimated: true, a basis string, and
baseline_tokens_per_query.
Memory logging must be enabled (answer yes when first prompted, or set NEURALMIND_MEMORY=1).
why (v0.43.0+)
Recall the recorded rationale behind code — the decision provenance a human authored, not something inferred.
Harvests Decision: git trailers from history and surfaces the ones whose subjects the query mentions. The trailer is the store: no database, nothing to build, and it works retroactively on commits already in history.
neuralmind why "<symbol or question>" [--project-path PATH]
Capture a decision by adding a trailer to a commit message (backticked symbols in the rationale become subjects automatically; an explicit Subjects: line is also honored):
cli: resolve org id per handler
Decision: resolveOrgId is per-handler, not middleware — avoids Prisma on
/health, /metrics, /token; keeps tests simple.
Subjects: `resolveOrgId`, `authMiddleware`
Arguments
| Argument | Description |
|---|---|
query |
A symbol or natural-language question, e.g. "why is resolveOrgId per-handler" |
Options
| Option | Default | Description |
|---|---|---|
--project-path |
. |
Project root to read git history from |
Sample Output
## NeuralMind decision provenance
- `resolveOrgId`, `authMiddleware`: resolveOrgId is per-handler, not middleware —
avoids Prisma on /health, /metrics, /token; keeps tests simple. (see commit ba25fed)
### doctor *(v0.12.0+)*
Run diagnostic checks on the index.
### eval *(v0.14.0+)*
Evaluate retrieval quality.
### feedback good/bad *(v3.1.4+)*
Provide explicit feedback on the last query's results.
#### Arguments
| Argument | Required | Default | Description |
|----------|----------|---------|-------------|
| `--json` | No | `false` | Output as JSON |
#### Output
Confirmation of edges boosted or penalized.
#### Examples
```bash
# Boost edges from last query (good feedback)
neuralmind feedback good .
# Penalize edges from last query (bad feedback)
neuralmind feedback bad .
Prerequisites
Requires a synapse store with edges from a previous query.
health (v3.1.4+)
Check NeuralMind health status.
Arguments
| Argument | Required | Default | Description |
|---|---|---|---|
--json |
No | false |
Output as JSON |
Output
Health status: healthy, stale (index ≥24h old), or no index.
Exit Codes
| Code | Meaning |
|---|---|
| 0 | Healthy |
| 1 | Stale (index ≥24h old) |
| 2 | No index |
Examples
# Check health
neuralmind health .
# Use in CI/CD
neuralmind health . || echo "Index needs rebuild"
status (v3.1.4+; index reporting v3.4.0+)
Two independent halves of a project’s state in one glance: what is indexed (code nodes, ingested content, when it was last built) and what has been learned (synapse edges, and an “is it learning?” diagnostic). Both are reported even when only one exists — a freshly ingested corpus has no synapses yet, and a long-lived project can carry months of learned edges over an index nobody has rebuilt.
neuralmind status . # human-readable dashboard
neuralmind status . --json # machine-readable
═══ NeuralMind Status — book ═══
Code nodes: 0 (0 edges) — content-only project
Last build: 0.4h ago
Disk: 2.1 MB
Content: 34 file(s), 306 chunks, 306 nodes
Last ingest: 2026-08-23T13:19:14+00:00
Status: 🟢 active
Namespace: personal
Edges: 318 (12 LTP-protected)
...
“Code nodes” is named that way so it doesn’t read as a total: a content-only project legitimately has zero of them and thousands of chunks.
| Argument | Required | Default | Description |
|---|---|---|---|
project_path |
No | . |
Project to inspect |
--json, -j |
No | false |
Output as JSON |
The JSON adds an index object (exists, path, nodes, edges,
built_at, age_hours, disk_mb) and a content object (files, chunks,
nodes, last_indexed_at, tracked) alongside the existing synapse keys.
Reads the IR and the content manifest straight off disk and never constructs a
vector backend, so it answers in milliseconds. An IR above 64 MB is summarized
rather than parsed — nodes comes back null and the build timestamp still
reports.
learn — document ingestion (v1.11.0+)
neuralmind gaps [project_path]
Phase 1 heuristics cover Express + Jest (JS/TS). Route paths are normalized across :id / {id} / ${...} / * styles so a registration and a test reference match; a test “hits the real DB” when its file imports a real-DB fixture (e.g. @/db, testDb) and the case isn’t skip-guarded (SKIP_PG, .skip).
Arguments
| Argument | Description |
|---|---|
project_path |
Project root to scan (default: current directory) |
Sample Output
## neuralmind gaps — live-Postgres coverage
Routes tested in-memory only (no live-DB coverage):
POST /api/sessions — 3 tests — all SKIP_PG ❌
GET /.well-known/jwks.json — 1 test — all SKIP_PG ❌
Endpoints with no tests:
POST /api/auth/jwk/rotate ⚠️
Live-covered:
GET /health ✅
gaps –structural (v1.9.0+)
Identify structural gaps in your codebase — missing bridges between communities that should be connected but aren’t. Built on Brandes’ betweenness centrality algorithm over the structural graph.
neuralmind gaps --structural [OPTIONS]
Options
| Option | Default | Description |
|---|---|---|
--top-k |
20 |
Maximum number of gaps to report |
--threshold |
0.0 |
Minimum gap score to include (0.0 = include all) |
--community |
None | Filter to specific community ID |
--json, -j |
False | Emit structured JSON output |
Examples
# Find top 20 structural gaps
neuralmind gaps --structural
# Find gaps with score > 0.5, JSON output
neuralmind gaps --structural --threshold 0.5 --json
# Gaps in a specific community
neuralmind gaps --structural --community 3
Sample Output
## NeuralMind — Structural Gaps (G5)
Rank Score Node Communities
──── ────── ───────────────────────────────────── ────────────
1 0.87 src/auth/token.py 2, 5
2 0.72 src/models/user.py 1, 3
3 0.65 src/utils/validation.py 2, 4
The equivalent MCP tool is neuralmind_structural_gaps.
review (v0.39.0+)
Warn about likely co-breakage before a commit or when reviewing a diff.
Reads the current git diff (or a specified base ref), finds changed files, and runs spreading activation through the learned synapse graph to surface files that are strongly associated but NOT in your diff — files that have historically been edited together with the ones you’re changing.
neuralmind review [project_path] [OPTIONS]
Options
| Option | Default | Description |
|---|---|---|
--base |
HEAD |
Git ref to diff against. Use HEAD~1 to review the last commit or a branch name to review a feature branch. |
--top-k |
10 |
Maximum number of at-risk files to report |
--json, -j |
False | Emit structured JSON output |
Examples
# Review uncommitted changes (diff against HEAD)
neuralmind review .
# Review the last commit
neuralmind review . --base HEAD~1
# Review changes on a feature branch vs main
neuralmind review . --base main
# JSON output for CI integration
neuralmind review . --json
Sample Output
NeuralMind review — my-project (diff against: HEAD)
Changed files (3):
• auth/middleware.py
• auth/handlers.py
• tests/test_auth.py
Co-break candidates — files NOT in diff but strongly associated (4):
0.782 ████████ auth/tokens.py
0.654 ██████ auth/models.py
0.431 ████ config/settings.py
0.198 ██ docs/auth.md
These files have historically been edited together with the ones above.
Consider whether your change also needs to touch them.
Requires the synapse graph to have accumulated edges. Cold graphs (first few sessions) return empty results. Also available as the neuralmind_review MCP tool.
Wiki reference: Tier2-Operator-Guide · Upgrade-Guide
onboarding (v1.7.0+)
Walk a new operator through license activation, governance defaults, admin email setup, and verification. The entry point for strangers who just ran neuralmind wakeup . and want to configure their project.
neuralmind onboarding # interactive mode — walks all 5 steps
neuralmind onboarding --quick # skip all prompts, defaults only
Options
| Option | Default | Description |
|---|---|---|
--quick |
false |
Skip all prompts, apply defaults (1-seat free, scope=both, threshold=0.1) |
What it walks through
- License activation — checks for
license.json. If missing, auto-issues free tier (or activates Team license if provided). - Governance defaults — sets
publishing_scope(personal/shared/both) andweight_threshold(0.0–1.0). - Admin email setup — adds admin emails for governance notifications.
- Team seat audit — lists current seats (
neuralmind team seats list). - Verification — prints license status + governance state.
Sample Output
$ neuralmind onboarding --quick
✓ Free tier activated (1 seat, never expires)
✓ Governance: scope=both, threshold=0.1
✓ Admin: (none — free tier)
✓ Seats: 1/1 (free)
Run `neuralmind team license status` to view.
Honest scope
- Free tier:
onboarding --quickconfigures governance but doesn’t issue paid license - Team tier: requires
neuralmind team license activate <file>before seat management works - Onboarding doesn’t install hooks or build the index — see
neuralmind install-hooksandneuralmind build
optimize-docs (v1.7.2+)
Run the DocEvolver — an evolutionary JSDoc optimizer that finds undocumented methods, generates JSDoc variants using mutation strategies, and evolves them against a retrieval fitness function (Recall@1).
neuralmind optimize-docs <project_path> [OPTIONS]
Arguments
| Argument | Required | Description |
|---|---|---|
project_path |
Yes | Path to project root |
Options
| Option | Default | Description |
|---|---|---|
--blind-spots |
— | Path to a JSON file of pre-computed blind spots (from neuralmind probe --json) |
--generations |
5 |
Number of evolution generations (G) |
--population |
8 |
Population size per generation |
--hysteresis |
0.05 |
Minimum fitness improvement required to promote a variant |
--dry-run |
False | Report only — no file modifications |
--json, -j |
False | Emit structured JSON output |
Examples
# Run full audit + evolution on a project
neuralmind optimize-docs .
# Dry-run (report only, no file changes)
neuralmind optimize-docs . --dry-run
# With pre-computed blind spots from probe
neuralmind probe . --json > spots.json
neuralmind optimize-docs . --blind-spots spots.json
# Custom evolution parameters
neuralmind optimize-docs . --population 10 --generations 8 --hysteresis 0.03
# Machine-readable output
neuralmind optimize-docs . --json
How it works
- Sample — generates N JSDoc variants per undocumented method via four mutation strategies:
LENGTH(1/3/5-line),STRUCTURE(Args/Returns vs prose-only vs mixed),KEYWORD_DENSITY(method-name synonyms vs generic description),POSITION(above vs inline for arrow functions). - Evaluate — patches each variant into the source, runs a natural-language query, and scores Recall@1 = 1/rank of the correct file.
- Promote — the best variant beats the incumbent by the hysteresis margin, then mutates around it for the next generation.
- Patch — after G generations, the winning JSDoc is written back to the source file.
Sample Output
$ neuralmind optimize-docs . --dry-run
DocEvolver — my-project
============================================================
Blind spots found: 12 undocumented methods
- handle_csv_export() (utils/csv.py)
- parse_headers() (utils/csv.py)
- validate_schema() (models/base.py)
...
Run without --dry-run to evolve JSDoc for these methods.
Files
neuralmind/doc_evolver.py— main module (1181 lines)tests/test_doc_evolver.py— 44 tests
Exit Codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | General error |
| 2 | Invalid arguments |
| 3 | graph.json not found |
| 4 | Index not built (run build first) |
| 5 | Database error |
Environment Variables
| Variable | Default | Description |
|---|---|---|
NEURALMIND_MEMORY |
1 |
Set to 0 to disable query memory logging |
NEURALMIND_LEARNING |
1 |
(deprecated, v0.25.0) Formerly disabled the learned_patterns cooccurrence reranker, which was removed in v0.25.0. Now inert — recognized but ignored. To disable the synapse layer’s prompt-time recall, use NEURALMIND_SYNAPSE_INJECT=0. |
NEURALMIND_BYPASS |
unset | Set to 1 to bypass PostToolUse hook compression temporarily |
NEURALMIND_OUTPUT_REDACT |
1 |
Set to 0 to stop redacting credentials from the PostToolUse Bash recovery cache (.neuralmind/last_output.json). The cache stores whatever a command printed, so with redaction off a printenv or an Authorization: Bearer header can land a live key in a plaintext file. Not recommended. |
NEURALMIND_REDACT_SECRETS |
unset | Set to 1 to scrub detected credentials from text before it enters the index — equivalent to neuralmind build . --redact-secrets. Off by default because redacting the index costs recall on legitimately secret-shaped identifiers. A backstop, not a substitute for removing and rotating the credential. |
NEURALMIND_TYPE_CHECK |
unset | (v3.0.0+) Set to 1 to confirm inferred return types with mypy during the build’s type-verification pass. Slower but more precise; without it, inference is AST/tree-sitter only. The pass itself runs whenever the synapse layer is enabled and is fail-open — type metadata is observability, never a gate on the build. |
NEURALMIND_SYNAPSE_INJECT |
1 |
(v0.4.0+) Set to 0 to disable spreading-activation context injection in the UserPromptSubmit hook |
NEURALMIND_PROVENANCE_INJECT |
1 |
(v0.43.0+) Set to 0 to disable decision-provenance injection in the UserPromptSubmit hook. When enabled (default), Decision: git trailers whose subjects appear in the prompt are surfaced as context alongside synapse recall. Reads git history (the trailer is the store — no separate DB); fails open, so a provenance miss never disrupts the prompt. Query the same data directly with neuralmind why. |
NEURALMIND_SYNAPSE_OUTLIERS |
unset | (v0.44.0+) Set to 1 to add the cohesion outlier check to the UserPromptSubmit injection. When enabled, it finds an associate most of a surfaced co-activation cluster links to and flags the members that skip it — the “handler #11” that breaks the cluster’s shared pattern (validateSession skips resolveOrgId while its 10 peers use it). Off by default; reads neighbors from the synapse store (no embedder work); fails open. |
NEURALMIND_SYNAPSE_EXPORT |
1 |
(v0.4.0+) Set to 0 to disable session-start synapse memory export |
NEURALMIND_REUSE_FEEDBACK |
1 |
(v0.41.0+) Set to 0 to disable the Edit/Write reuse-vs-rewrite feedback hook. When enabled (default), new code that references a symbol already defined elsewhere in the graph reinforces the synapse edge between the edited file and the reused definition, so retrieval learns what you actually reuse. The implicit complement to the explicit neuralmind_feedback MCP tool. Language-agnostic, never forces a build, fail-open. |
NEURALMIND_TEAM_MEMORY |
1 |
(v0.30.0+) Set to 0 to disable auto-inheriting a committed .neuralmind-team-memory.json team bundle. When enabled (default), a teammate’s SessionStart/build imports the bundle once into the shared namespace (content-hash-gated, shared-only, fail-open). Publish your own with neuralmind memory publish. |
NEURALMIND_EVENT_LOG |
1 |
(v0.6.0+) Set to 0 to disable the cross-process JSONL event-bridge writer at <project>/.neuralmind/events.jsonl. The in-process event bus is unaffected; serve running in the same process as the activity source still gets a live feed. |
NEURALMIND_OUTPUT_CACHE |
1 |
(v0.10.0+) Set to 0 to disable the recovery cache that backs neuralmind last. |
NEURALMIND_OUTPUT_CACHE_MAX |
2097152 |
(v0.10.0+) Total size cap (bytes) for the recovery cache. Oversize payloads are split proportionally between stdout/stderr and truncated keeping head + tail. |
NEURALMIND_BASH_SMALL |
500 |
(v0.10.0+) Threshold below which failing Bash outputs pass through verbatim (no compression marker). Tunable to suit your noise tolerance. |
NEURALMIND_BASH_MAX_CHARS |
3000 |
Threshold above which successful Bash outputs get compressed. |
NEURALMIND_BASH_TAIL |
3 |
Number of tail lines always kept verbatim in compressed Bash output. |
NEURALMIND_EVAL_LLM_JUDGE |
0 |
(v0.13.0+) Opt-in LLM-as-judge mode for the offline faithfulness eval harness (evals/faithfulness/). Off by default and never the CI gate; when set, the runner prints a notice that answers + gold facts would be sent to a third-party API. The default judge is the zero-network offline expected-fact-recall scorer. |
NEURALMIND_PARITY_REDUCTION_TOL |
0.25 |
(v0.15.0+) Backend parity gate (evals/parity/run.py): max fraction the built-in backend’s mean token reduction may sit below graphify’s (0.25 = within 25%). |
NEURALMIND_PARITY_FAITHFULNESS_TOL |
0.10 |
(v0.15.0+) Backend parity gate: max absolute points the built-in backend’s faithfulness delta / fact recall may sit below graphify’s (0.10 = 10 points). |
NEURALMIND_PARITY_REDUCTION_FLOOR |
4.0 |
(v0.15.0+) Backend parity gate: absolute minimum mean reduction the built-in backend must clear, independent of graphify (mirrors the self-benchmark floor). |
NEURALMIND_PARITY_FAITHFULNESS_FLOOR |
0.0 |
(v0.15.0+) Backend parity gate: absolute minimum faithfulness delta the built-in backend must clear (mirrors the eval gate — smart selection ≥ matched-budget naive truncation). |
NEURALMIND_PARITY_COVERAGE_FLOOR |
0.90 |
(v0.16.0+) Backend parity gate: minimum fraction of the gold graph’s per-language symbols the built-in backend must recover for TypeScript/Go/Rust/Java/C/C++ (structural parity, since no gold-fact set exists for those fixtures yet). |
NEURALMIND_PRECISION |
unset | (v0.17.0+) Set to 1 to enable the optional SCIP precision pass: when a *.scip index is present in the project root, the built-in backend’s heuristic calls/inherits edges are replaced with compiler-accurate ones for the files the index covers. Off by default; a no-op when unset or when no index is found. |
NEURALMIND_ONNX_MODEL_DIR |
unset | (v0.21.0+) Path to a pre-extracted all-MiniLM-L6-v2 ONNX folder (model.onnx + tokenizer.json) for the ChromaDB-free turbovec backend’s bundled embedder. When unset, the model is resolved from NeuralMind’s cache, an existing ChromaDB cache, or downloaded (SHA256-verified). Set it for air-gapped installs so no network is needed. |
NEURALMIND_ORT_THREADS |
unset | Pin the ONNX Runtime intra-op thread pool for the bundled MiniLM embedder to N threads (inter-op is set to 1 alongside it). Unset keeps ORT’s default (sized to the host’s core count). ORT’s parallel summation order moves the last bits of the embedding floats with the thread count, so near-tie rankings can differ between machines with different core counts; 1 makes embeddings machine-independent at some indexing-throughput cost. The self-benchmark harness sets 1 automatically so its published numbers don’t depend on which CI runner it drew. |
NEURALMIND_NO_DAEMON |
unset | (v0.23.0+) Set to 1 to force CLI commands to run in direct mode even when a daemon is running (skips the daemon auto-preference for query/stats). |
NEURALMIND_NAMESPACE |
unset | (v0.24.0+) Pin the active memory namespace for this process (e.g. ephemeral for throwaway exploration, shared on a CI box building team baseline). Overrides config and git-branch detection. Resolution order: this var → memory_namespace: in neuralmind-backend.yaml → branch:<name> on a non-default git branch → personal. |
NEURALMIND_DAEMON_HOME |
unset | (v0.23.0+) Override the directory holding the daemon discovery file (daemon.json). Defaults to ~/.neuralmind. Mainly for tests / running an isolated daemon. |
NEURALMIND_BM25 |
1 |
(v0.38.0+) Set to 0 to disable the BM25 keyword index and fall back to pure vector search. When enabled (default), the BM25 index built by neuralmind build is merged with vector results via Reciprocal Rank Fusion at query time, improving exact-name retrieval for code queries like "UserService" or "get_auth_token". The index is stored in <project>/.neuralmind/bm25_index.json and rebuilt automatically on every neuralmind build. |
NEURALMIND_SELECTOR_AUTOTUNE |
0 |
(v0.26.0+) Set to 1 to enable the self-improvement engine’s selector auto-tuner: the SessionStart hook adjusts the L2 recall depth from the re-query rate (once per session), and build() threads the persisted value into the selector. Opt-in (== "1", not the != "0" pattern) because it is net behavior change. With it unset the hot path does zero extra I/O and the selector keeps its hard-coded default. Inspect state with neuralmind self-improve status. |
NEURALMIND_STRUCTURAL |
1 |
(v0.42.0+) Master switch for the structural code-graph layer (calls/inherits/imports_from edges from graph.json). Powers the neuralmind structural command, the neuralmind_structural_neighbors MCP tool, and blast-radius. Set to 0 to skip building the index entirely, leaving retrieval byte-identical to v0.41.0. |
NEURALMIND_STRUCTURAL_RECALL |
0 |
(v0.42.0+) Opt-in (== "1"). Fold a query hit’s structural neighbors (callers/callees/base classes) into L3 retrieval, budget-neutrally (displacement, not addition). Off by default because the structural signal can saturate top-k recall and crowd out the learned synapse reranker on some graphs; the always-on structural query tools carry the value with zero effect on the tuned retrieval stack. |
NEURALMIND_STRUCTURAL_MIN_CONFIDENCE |
0.0 |
(v0.42.0+) Drop structural edges whose confidence_score is below this value when building the index. Raise toward 1.0 to trust only compiler-accurate edges (pair with NEURALMIND_PRECISION). |
NEURALMIND_STRUCTURAL_HUB_DEGREE |
50 |
(v0.42.0+) Per-relation degree cap for structural recall and blast-radius. Above the cap, an over-connected utility’s neighbors are down-weighted (recall) or truncated (blast-radius) so one hub can’t dominate. |
NEURALMIND_DRIFT_REFRESH |
1 |
(v3.2.0+) Set to 0 to make neuralmind drift judge strictly against the last-built graph, skipping the transparent re-parse of changed files (same effect as --no-refresh). The re-parse needs tree-sitter (the graphgen extra); without it this is already a no-op. |
NEURALMIND_CHUNK_SIZE |
500 |
(v3.4.0+) Default max characters per chunk for ingest-content, so a corpus’s chunking doesn’t have to be retyped on every run. --chunk-size overrides it. A malformed value warns and falls back to the default rather than failing the ingest. |
NEURALMIND_OVERLAP |
50 |
(v3.4.0+) Default character overlap between chunks for ingest-content. --overlap overrides it. Must be less than the chunk size — the chunker cannot make progress otherwise, so the command exits 2 with the offending pair named. |
NEURALMIND_INGEST_TIMEOUT |
0 |
(v3.4.0+) Default --timeout for ingest-content, in seconds; 0 means unlimited. On expiry the run stops between files, writes the manifest for what it indexed, and exits 1 — the next run resumes rather than restarting the corpus. |
NEURALMIND_NO_PROGRESS |
unset | (v3.4.0+) Set to 1 to suppress progress output everywhere (same as --no-progress). Progress is TTY-aware already — an in-place bar on a terminal, plain milestone lines off one — so this is for golden-output tests and log-sensitive CI jobs. |
Vector backend selection (v0.21.0+)
NeuralMind’s vector store is pluggable. The default is auto (an unset config
behaves the same): it resolves to the ChromaDB-free turbovec backend when
its stack (turbovec + onnxruntime + tokenizers) is importable, and
otherwise falls back to chroma. As of v0.29.0 the turbovec stack is a
platform-gated base dependency, so a plain pip install neuralmind resolves
to turbovec (ChromaDB-free) out of the box on platforms with turbovec wheels
(Linux, macOS arm64, Windows x86_64). On platforms without a turbovec wheel
(Intel macOS, Windows ARM) ChromaDB is auto-installed as the fallback backend,
so the install always works. Install pip install "neuralmind[chromadb]" (and
pin backend: graph) to force ChromaDB anywhere. (Alpine/musl Linux: use a
python:slim glibc image or the [chromadb] extra — markers can’t gate musl.)
To pin a backend explicitly (an explicit value always wins over auto), drop
a neuralmind-backend.yaml at the project root:
backend: turbovec # the default path: TurboVec ANN + bundled OnnxMiniLMEmbedder
# backend: graph # force ChromaDB (alias: chroma) — needs `pip install "neuralmind[chromadb]"`
# backend: auto # the default — turbovec when its deps are installed, else chroma
The turbovec/ONNX stack ships by default; pip install "neuralmind[chromadb]"
adds the opt-in ChromaDB backend. Vectors are byte-identical between backends, so
retrieval quality is at/above parity; the turbovec index is 8–16× smaller.
Selecting graph/chroma without the [chromadb] extra raises an actionable
error pointing at the install command. Accepted values: auto (default),
graph / chroma, turbovec, in_memory (offline tests).
One-time auto-reindex. When auto resolves to turbovec for a project that
still has a legacy ChromaDB index and no turbovec index yet, the next build
reindexes from graph.json and prints a one-line notice. The old ChromaDB index
is left in place as a fallback — nothing is deleted.
Run neuralmind doctor to see which backend the current environment resolves to
(see the Backend line).
Examples
Complete Workflow
# 1. Build neural index (the code graph is generated automatically)
neuralmind build ~/projects/myapp
# 3. View statistics
neuralmind stats ~/projects/myapp
# 4. Get wake-up context for new conversation
neuralmind wakeup ~/projects/myapp > context.md
# 5. Query specific functionality
neuralmind query ~/projects/myapp "How does the payment system work?"
# 6. Search for specific entities
neuralmind search ~/projects/myapp "PaymentController" --n 5
# 7. Run benchmark
neuralmind benchmark ~/projects/myapp
Scripting Integration
#!/bin/bash
# update_and_query.sh - Update index and run queries
PROJECT="$1"
QUERY="$2"
# Rebuild if graph changed
if [ graphify-out/graph.json -nt graphify-out/neuralmind_db ]; then
echo "Graph updated, rebuilding index..."
neuralmind build "$PROJECT"
fi
# Run query
neuralmind query "$PROJECT" "$QUERY" --json
Piping to AI Tools
# Get context and pipe to clipboard (macOS)
neuralmind wakeup ~/projects/myapp | pbcopy
# Get context and pipe to clipboard (Linux)
neuralmind wakeup ~/projects/myapp | xclip -selection clipboard
# Save context to file for AI assistant
neuralmind query ~/projects/myapp "Explain the auth system" > auth_context.md
See Also
- API Reference - Python API documentation
- Architecture - System design details
- Integration Guide - MCP and tool integrations