Skip to content

Introduction

Syne is a local-first code-context compiler. It reads a Java or PL/SQL project from a git reference, parses it, and stores a queryable code graph in an embedded graph database that speaks Cypher. Nothing is sent anywhere: parsing, storage, and querying all happen on your machine.

Status: early prototype, no public release yet. The command surface and the graph schema are expected to change.

The name

Syne is short for synecdoche — the figure of speech where a part stands for the whole, or the whole for a part. That is the operation: expand a part of a codebase (a reference, an entry point, a commit) into the whole picture, or collapse a whole codebase down to the parts that matter for one question.

What gets stored

The graph holds five kinds of node — File, Type, Callable, Statement, and DataEntity (a table or view) — joined by four kinds of edge: structural containment, references, call flow, and data access.

Two rules shape everything:

  • Metadata only. Signatures, source spans, and docstrings are stored; method bodies are not. Source is hydrated on demand from the git ref when something actually needs to read it. The one exception is PL/SQL statement text, which is stored verbatim.
  • Accuracy over completeness. Every edge carries a confidence score, and unresolved calls are recorded as unresolved rather than guessed. A missing edge means not seen, never does not exist.

The three questions

Syne is built around three queries, each available as a CLI command and as an MCP tool:

QuestionCommandAnswers
Blast radiussyne blast-radius <type>What transitively depends on this type — or, for table:NAME, what reads and writes this table
Blueprintsyne blueprint <pkg>The structural skeleton of a package, without any method bodies
Call stacksyne call-stack <entry>The forward call flow from an entry point, down to the statements and tables it touches

Commands

syne index [<target>]        build a code graph from a git branch into the configured store
syne wire [<target>]         wire this repo's map into AGENTS.md/CLAUDE.md, .claude/skills/, .mcp.json
syne query <cypher>          run a Cypher query against the graph
syne blueprint <pkg>         render a package's structural skeleton
syne blast-radius <type>     find transitive dependents of a type, or readers/writers of a table
syne call-stack <entry>      trace call flow forward from an entry point
syne diff <twinA> <twinB>    compare two JSON exports of the graph
syne mcp [<target>]          serve the graph to an LLM or IDE over MCP (stdio, read-only)
syne clean <target>          remove syne artifacts: logs | db | all

<target> is a local repository path (default .) or a remote URL, which is cloned to a temporary directory, indexed, and cleaned up.

Reading from git, not from disk

By default syne reads files from the requested git ref (--branch, default HEAD), straight from the object database. Uncommitted edits in your working tree are therefore invisible — which is what makes an index deterministic and rebuildable from history. Pass --working-tree to index the on-disk files instead, including untracked ones.

Serving the graph to an agent

syne mcp starts a Model Context Protocol server on stdio and exposes five tools: blueprint, blast_radius, call_stack, get_source (on-demand source hydration), and cypher (a bounded read-only escape hatch). Read-only is enforced by the store itself, not by convention, so a write attempted through cypher is rejected.

syne wire sets this up for you: it writes a pointer block into AGENTS.md or CLAUDE.md, projects a repository skill into .claude/skills/, and with --mcp adds a syne entry to .mcp.json.

Next: Installation.

Released under the MIT License.