Skip to main content
Two layers, kept deliberately apart.

Static analysis

lib/analysis reads the repository with ts-morph and produces facts — imports, exports, symbols, the client/server boundary, the dependency graph. Nothing here is an interpretation. This is what runs when you connect a repository or run npm run refresh.

Semantic interpretation

lib/llm turns those facts into systems and concepts — the first map of project knowledge.
  • For a hosted analysis, it is generated from a structural digest, never from the source of the whole repo.
  • For an agent on your machine, the digest is a brief. The agent is expected to open the real files, then submit through MCP.
A good interpretation names systems the way a maintainer would in conversation, explains why this codebase ends up at an idea, and cites only line ranges that actually exist.

One capability list

Everything the product can do lives in lib/services. The web app and the MCP server both call those functions. Adding a surface later means wrapping the same list, not rewriting it.
Refresh refuses rather than degrades. If the code has moved far enough that the stored interpretation no longer resolves, it says so and asks for a full re-analysis.