The binding
Grep finds twelve types implementing IStore — mocks, fakes, a legacy adapter. Exactly one is registered. csmesh tags it [di-bound] and ranks it first.
Text search stops at the interface. csmesh compiles your solution with Roslyn into a frozen symbol graph and prints the resolved path — which implementation the container injects, which handler a Send() reaches, which endpoints break if you touch a property — with a hard cap on how many tokens come back.
curl -fsSL https://raw.githubusercontent.com/nRafinia/CsMesh/main/install.sh | sh
Colour is information here, not decoration: amber is the implementation the container registered, violet is a mediator dispatch, teal is an HTTP entrypoint.
Ask an agent where a payment ends up in a layered .NET solution and it starts hopping files. Every hop costs a turn, and the context window pays for all of them.
4 turns spent, roughly 4,100 tokens burned, still no answer
csmesh trace PaymentController.Post --budget 600The container binding, the mediator hop, the concrete repository and the DbContext underneath it — resolved from compiler symbols, ordered so the code that actually runs comes first.
1 turn, 118 tokens, exit 0
Every layered .NET app is held together by indirection that exists only at compile time or at container-build time. Lexical search cannot follow any of it.
Grep finds twelve types implementing IStore — mocks, fakes, a legacy adapter. Exactly one is registered. csmesh tags it [di-bound] and ranks it first.
The handler sits in another project with no textual link back to the caller. csmesh matches the request type to its IRequestHandler and draws the edge across the boundary.
Attribute routes, MassTransit consumers, hosted services. Tagged as entrypoints, so a blast radius tells you which HTTP calls actually break — not which files mention the word.
Pick one. Every answer is capped by --budget; when the answer is genuinely bigger than the cap, the process exits 2 with a hint instead of flooding the window.
A multi-project .NET solution, roughly 1,600 nodes and 3,000 edges. The same questions asked two ways, recorded by the tool's own usage telemetry.
Against three to five seconds of grep, file reads and model round trips.
Around a hundred tokens returned where the file-hopping loop spent four thousand.
Chainable with &&, so two questions still cost one turn.
| Metric | grep and file reads | csmesh | Difference |
|---|---|---|---|
| Query latency | 3,000–5,200 ms | 94–111 ms | 35–50× faster |
| Agent turns | 2–4 turns | 1 command | up to 75% fewer |
| Context spent | 3,500–4,800 tokens | 73–125 tokens | ~85% reduction |
| DI resolution | guesswork | deterministic | reads the registration |
| False positives | mocks, comments, logs | none | compiler symbols only |
No text parsing, no heuristics. The process says what happened and what to do next.
Complete answer, within budget. Use it.
No such symbol here. Check the spelling or the namespace.
The answer exists but is bigger than the cap. Narrow --depth rather than raising the budget.
Several symbols match. Re-run with Type.Member.
No graph on disk yet. Run csmesh index.
Bad flags or arguments. Run the command with --help.
One command writes the skill and rule files each tool expects, in the repository or machine-wide with --global. Shared files like AGENTS.md get a tagged block, so rules you wrote yourself survive the install.
csmesh skill --installTwo paths. The prebuilt Native AOT binary needs nothing installed and starts in under 100 ms; the global tool needs the .NET SDK and updates through NuGet.
curl -fsSL https://raw.githubusercontent.com/nRafinia/CsMesh/main/install.sh | sh
irm https://raw.githubusercontent.com/nRafinia/CsMesh/main/install.ps1 | iex
Falls back to dotnet tool automatically when no release asset matches your architecture.
dotnet tool install --global CsMesh.Clidotnet tool update --global CsMesh.CliThen, in any repository with a .sln, .slnx or .csproj: run csmesh index once, and csmesh doctor whenever an answer looks wrong.