Use when you need blast-radius analysis, dependency graphs, cross-repo impact, breaking-change diff, or architectural overview of .NET workspaces. Keywords: blast radius, dependency graph, impact analysis, cross-repo, call graph, endpoint map, EF Core lineage, breaking change, daemon, reindex.
Scanned 5/27/2026
Install via CLI
openskills install Metalnib/dotnet-episteme-skills---
name: dotnet-techne-synopsis
description: Use when you need blast-radius analysis, dependency graphs, cross-repo impact, breaking-change diff, or architectural overview of .NET workspaces. Keywords: blast radius, dependency graph, impact analysis, cross-repo, call graph, endpoint map, EF Core lineage, breaking change, daemon, reindex.
disable-model-invocation: false
user-invocable: true
license: MIT
compatibility: Pre-built binaries for osx-arm64, osx-x64, win-x64, win-arm64, linux-x64, linux-arm64. No SDK required.
metadata:
author: Metalnib
version: "1.5.0"
trigger_keywords:
- blast radius
- dependency graph
- impact analysis
- cross-repo dependencies
- call graph
- endpoint map
- ef core lineage
- what does this change affect
- architectural overview
- breaking change diff
- reindex repository
- daemon mode
---
# Synopsis - .NET Workspace Dependency & Blast-Radius Explorer
Static analysis tool that scans .NET workspaces via Roslyn, builds a dependency graph, and answers blast-radius and breaking-change queries. Supports both one-shot CLI use and long-running daemon mode for multi-repo workspaces.
## Requirements
No SDK or manual installation needed. The detect script auto-downloads the correct binary on first use.
| Platform | Binary | Downloaded from |
|---|---|---|
| macOS Apple Silicon | `bin/osx-arm64/synopsis` | GitHub Release `synopsis-osx-arm64.tar.gz` |
| macOS Intel | `bin/osx-x64/synopsis` | GitHub Release `synopsis-osx-x64.tar.gz` |
| Windows x64 | `bin/win-x64/synopsis.exe` | GitHub Release `synopsis-win-x64.zip` |
| Windows arm64 | `bin/win-arm64/synopsis.exe` | GitHub Release `synopsis-win-arm64.zip` |
| Linux x64 | `bin/linux-x64/synopsis` | GitHub Release `synopsis-linux-x64.tar.gz` |
| Linux arm64 | `bin/linux-arm64/synopsis` | GitHub Release `synopsis-linux-arm64.tar.gz` |
External dependencies for auto-download:
- **macOS/Linux:** `curl` (pre-installed) or `wget`
- **Windows:** PowerShell 5+ (built-in `System.Net.Http`)
## Install (optional - build from source)
Only needed if you want to rebuild or no GitHub Release is available. Requires .NET 10+ SDK.
**Bash (Linux/macOS):**
```bash
./skills/dotnet-techne-synopsis/scripts/install.sh
```
**PowerShell (Windows):**
```powershell
.\skills\dotnet-techne-synopsis\scripts\install.ps1
```
## When to use this skill
Use when the user asks to:
- Analyze blast radius of a code change
- Map dependencies across .NET repos
- Find what endpoints/services are affected by a change
- Trace call chains from controller to database
- Review cross-repo boundaries
- Audit ambiguous/unresolved dependencies
- Compare architecture between two snapshots (diff)
- Classify breaking changes between two snapshots
- Scope a PR's impact via git diff
- Run a persistent daemon serving multiple repos under one graph
- Find all callers of an HTTP endpoint across repos (`endpoint_callers`)
- Find which services depend on a NuGet package and at what version (`package_dependents`)
- Find HTTP endpoints that write to a specific database table (`table_entry_points`)
- Get a service-to-service HTTP call dependency map (`repo_dependency_matrix`)
## Workflow
### Step 0: Detect tool
**Bash:**
```bash
./skills/dotnet-techne-synopsis/scripts/detect-tool.sh
```
**PowerShell:**
```powershell
.\skills\dotnet-techne-synopsis\scripts\detect-tool.ps1
```
### Step 1: Scan a workspace
```bash
synopsis scan /path/to/workspace -o graph.json
```
This produces `graph.json` containing all nodes (repos, projects, controllers, methods, endpoints, HTTP clients, DB contexts, entities, tables, NuGet packages) and edges (calls, injects, implements, cross-repo, depends-on-package, etc.).
### Step 2: Query the graph
**Blast radius of a symbol:**
```bash
synopsis query symbol --fqn "OrdersController" --blast-radius --graph graph.json
synopsis query symbol --fqn "IOrderRepository" --blast-radius --direction upstream --graph graph.json
```
**Impact analysis:**
```bash
synopsis query impact --node "OrdersController" --direction downstream --graph graph.json --json
synopsis query impact --node "Orders" --direction upstream --graph graph.json --json
```
**Find paths between nodes:**
```bash
synopsis query paths --from "OrdersController" --to "Orders" --graph graph.json --json
```
**Audit ambiguous edges:**
```bash
synopsis query ambiguous --graph graph.json --json
```
### Step 3: Git-aware analysis
Scope analysis to files changed in a PR:
```bash
synopsis git-scan /path/to/workspace --base main --json
```
### Step 4: Diff two scans
Compare architecture before/after a change:
```bash
synopsis diff before.json after.json --json
```
### Step 5: Breaking-change classification
Classify typed breaking changes between two snapshots:
```bash
synopsis breaking-diff before.json after.json --json
synopsis breaking-diff before.json after.json -o report.json
```
Produces typed `BreakingChangeKind` values:
- **Paired changes:** `NugetVersionBump`, `EndpointRouteChange`, `EndpointVerbChange`, `ApiSignatureChange`, `TableRename`
- **Removals:** `PackageRemoved`, `EndpointRemoved`, `ApiRemoved`, `TableRemoved`
Heuristic pairings carry `Ambiguous` certainty; unmatched nodes flow into removal kinds.
### Step 6: MCP daemon mode (multi-repo)
For persistent AI agent integration over multiple repositories. The daemon holds a `CombinedGraph` that merges per-repo scans in memory and persists state to disk.
**stdio (one-shot, single repo):**
```bash
synopsis mcp --root /path/to/workspace
synopsis mcp --graph graph.json
```
**Unix socket daemon (multi-repo, persistent):**
```bash
synopsis mcp --root /path/to/workspace --socket /tmp/synopsis.sock --state-dir ~/.synopsis/workspace
```
**TCP daemon:**
```bash
synopsis mcp --root /path/to/workspace --tcp localhost:5100
```
State is persisted to `--state-dir` and restored on restart. On restart, repos are loaded from disk without re-scanning; use `reindex_all` to force a fresh scan of all known repos.
## Quick Reference
```bash
# === One-shot scan and query ===
synopsis scan /workspace -o graph.json # Scan
synopsis query symbol --fqn "OrdersController" --blast-radius # Blast radius
synopsis query impact --node "Orders" --direction upstream --json # Upstream impact
synopsis git-scan /workspace --base main --json # PR impact
synopsis breaking-diff before.json after.json --json # Breaking changes
# === Export formats ===
synopsis export json /workspace -o graph.json
synopsis export csv /workspace -o output/
synopsis export jsonl /workspace -o graph.jsonl
# === Daemon (multi-repo) ===
synopsis mcp --root /workspace --socket /tmp/synopsis.sock --state-dir ~/.synopsis/ws
# === All commands support --json for machine-readable output ===
synopsis scan /workspace --json
synopsis query impact --node X --json
```
## Output Contract
When `--json` is used, stdout contains a single JSON envelope:
```json
{"command":"query impact","ok":true,"result":{...},"ms":142}
```
All diagnostics and progress go to stderr. stdout is always machine-readable when `--json` is specified.
## MCP Tools Available
When running in MCP mode (`synopsis mcp`), the following tools are exposed:
| Tool | Description |
|---|---|
| `blast_radius` | Upstream/downstream impact subgraph for a symbol |
| `find_paths` | All paths between two nodes |
| `list_endpoints` | HTTP endpoints filtered by project/verb |
| `list_nodes` | Nodes filtered by type/project/query |
| `node_detail` | Single node with all incoming/outgoing edges |
| `db_lineage` | EF Core entity-to-table lineage chain |
| `cross_repo_edges` | All cross-repository boundary edges |
| `ambiguous_review` | Unresolved and ambiguous edge audit |
| `scan_stats` | Scan statistics and metadata |
| `breaking_diff` | Classify breaking changes between two graph snapshots |
| `endpoint_callers` | All callers of an HTTP endpoint across repos, with certainty |
| `package_dependents` | All repos/projects that depend on a NuGet package, with versions |
| `table_entry_points` | HTTP endpoints that eventually read or write a database table |
| `repo_dependency_matrix` | Per-repo outbound call counts and resolved cross-repo dependency pairs |
| `list_repositories` | List all repos in the CombinedGraph with scan metadata |
| `reindex_repository` | Re-scan a single repository and update the graph |
| `reindex_all` | Re-scan all known repositories |
## HTTP Cross-Service Resolution
Synopsis traces HTTP calls across microservice boundaries. For best resolution accuracy:
- **Use `IHttpClientFactory` with named clients** — the client name is the strongest signal for matching
- **Put base URLs in appsettings with descriptive keys** — `Services:CatalogApi:BaseUrl` not generic `ApiUrl`
- **Name repos and projects consistently** — `CatalogClient` auto-matches repo `catalog-api` and project `Catalog.Api`
See [http-resolution.md](http-resolution.md) for the full guide on supported patterns, appsettings configuration, service-affinity matching, certainty levels, and recommendations.
## Notes
- Synopsis uses Roslyn MSBuildWorkspace for semantic analysis — it understands DI registration, interface dispatch, call graphs, and EF Core mappings
- The tool targets .NET Core/.NET 5+ projects only (no .NET Framework 4.x support)
- First scan of a large workspace takes 15–60s; subsequent queries on a loaded `graph.json` are instant
- MCP daemon mode scans once at startup (or on `reindex_*` calls), then serves queries with no re-scan overhead
- NuGet packages are first-class graph nodes (`Package` type, `DependsOnPackage` edges) from v1.4.0
- Graph node IDs are SHA256-based and stable across scans of the same codebase
No comments yet. Be the first to comment!