Here's what actually happens when you vibe code a real project:
You ask your AI to add a feature. It writes the code. Looks right. You ship it. Then something breaks three layers deep — a function that imported from the file it just rewrote, a module boundary it didn't know existed, a constraint your team defined six months ago. Your AI had no idea. It never does.
The problem isn't the model. The problem is that every AI coding tool gives your AI a flat list of files and asks it to infer architecture from that. It can't. It guesses. And on non-trivial codebases, the guesses compound.
Specifically: - it doesn't know which functions depend on the file it's editing - it doesn't know your module ownership or layer rules - it doesn't know what changed since the last prompt - it has no way to validate its plan against your actual architecture before writing
Mikk fixes this by building a directed graph — the Mesh — of your entire codebase. Not a summary. Not embeddings. An actual graph: every function as a node, every import and call as a typed edge, forward and reverse adjacency maps for O(1) traversal in either direction.
`mikk init` runs in ~3 seconds on a 90-file project: - 2,847 functions parsed via TypeScript Compiler API (real AST, not regex) - 9,442 edges in the dependency graph - SHA-256 Merkle tree at function → file → module → root level - everything written to mikk.lock.json, ~60% smaller than raw source - claude.md + AGENTS.md generated with tiered architecture context
Then an MCP server exposes the graph. Your AI doesn't get a paste. It calls tools against the real graph mid-task.
Three things that actually matter:
1. blast radius before the edit `mikk_before_edit` walks the reverse dependency map from the file you're about to touch. Returns every upstream caller, every exported API at risk, every constraint that applies. Your AI sees the full blast radius before it writes a single line. `mikk_impact_analysis` goes deeper — transitive blast radius across the entire graph, estimated impact level, public API consumers.
2. context that's not RAG The AI Context Builder seeds from your task description, BFS-traverses the call graph outward, scores each reachable function by proximity + keyword match + entry-point bonus, then greedily packs the highest-scoring functions into your token budget. Every result includes exact file path, start line, end line, and full source body. No hallucinated paths. No wrong modules.
3. architecture that enforces itself Define module boundaries in mikk.json. Six constraint types: no-import, must-use, no-call, layer, naming, max-files. `mikk contract validate --strict` fails CI with exact file + rule citations. ADRs sit alongside constraints so your AI knows why a rule exists, not just that it does.
Local-first. No cloud. No telemetry. No API keys. TypeScript, JavaScript, Go.
https://github.com/ansh-dhanani/mikk https://mikk-web.vercel.app