代码理解工具

Synapps是一个代码理解工具,通过构建可查询的代码图,帮助AI代理或开发者更安全、快速地进行代码修改。

  • by alexjsmith0115
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 alexjsmith0115/synapse

使用说明

Synaps

让你的AI代理深入了解你的代码库——不仅仅是文件和符号,还有它们之间的关系。

Synapps是一个MCP服务器和CLI,它使用语言服务器协议分析构建代码库的可查询图。它对符号、调用链、继承树、接口实现和C#、Python、TypeScript/JavaScript和Java项目的类型依赖关系进行索引,然后让AI代理(或人类)查询该图,以进行更安全、更快、更明智的代码更改。

为什么选择Synaps

如今,处理代码的AI代理依赖于grep和文件读取。这适用于简单的查找,但当问题出现时就会崩溃 “如果我改变这个,会发生什么?” --当答案取决于调用链、接口调度、继承和跨越数十个文件的测试覆盖率时。

Synapps让你的代理在不读取每个文件的情况下,对代码如何连接有编译器级的理解。

没有Synapps 有Synapps
感谢 .DoWork( 在整个代码库中,手动过滤误报 find_usages("DoWork") --精确的结果,包括通过接口调用
编辑前阅读5+个文件以了解方法 get_context_for("X", scope="edit") --一次调用中的源、调用者、依赖关系和测试覆盖率
希望在重构之前找到每个调用者 get_context_for("X", scope="impact") --具有测试覆盖率的结构化影响报告
从方法手动跟踪到其API终结点 find_entry_points("X") --自动根调用者发现
猜猜哪些测试涵盖了一种方法 find_tests_for --直接试验→通过TESTS边查找方法 (实验)
检查代码库中的测试覆盖率差距 find_untested --无测试覆盖的生产方法 (实验)
浏览数十个文件以了解新的代码库 get_architecture --在一次调用中包含包、热点方法、HTTP服务映射和统计信息
手动审核未使用的方法 find_dead_code --零调用者的方法,过滤出误报 (实验)

快速开始

pip install synapps-mcp
synapps init

synapps init 引导您完成设置:

  1. 检测语言 在你的项目中(C#、Python、TypeScript、Java)
  2. 检查先决条件 --Docker、Memgraph和仅用于检测到的语言的语言服务器
  3. 显示修复命令 对于任何缺失的内容(特定于平台: brew 在macOS上, apt 在Linux上)
  4. 为您的项目建立索引 --自动构建代码图
  5. 配置您的MCP客户端 --检测Claude Desktop、Claude Code、Cursor或Copilot,并提供编写配置
  6. 安装预工具挂钩 --可选的咨询挂钩,提醒代理在返回grep/文件搜索之前使用图形工具(Claude Code、Cursor、GitHub Copilot)

init完成后,您的AI代理可以立即使用Synapps工具。

从源代码开发: pip install -e .

先决条件

  • Python 3.11+
  • 码头工人 --Synapps自动管理Memgraph容器。连接到外部Memgraph实例时不需要。
  • 语言服务器 (仅适用于项目中的语言):
    • CNET SDK(Roslyn语言服务器在第一个索引上自动下载)
    • Python:Pyright(npm install -g pyright)
    • Types/JavaScript: npm install -g typescript-language-server typescript
    • Java:Eclipse JDTLS(自动管理)

跑 synapps doctor 检查你的环境。

手动MCP配置

synapps init 自动处理此问题。要手动配置,请执行以下操作:

克劳德桌面 / 克劳德代码 / 光标:

{
  "mcpServers": {
    "synapps": {
      "command": "synapps-mcp"
    }
  }
}

配置文件位置:Claude Desktop(claude_desktop_config.json)克劳德代码(.mcp.json),光标(~/.cursor/mcp.json).

VS代码/GitHub副本 (.vscode/mcp.json):

{
  "servers": {
    "synapps": {
      "command": "synapps-mcp"
    }
  }
}

特性

深度调用图

Synapps使用两阶段索引方法:LSP提取结构符号(类、方法、属性),然后树保姆找到调用点,LSP解析每个调用指向的内容。结果是方法之间的CALLS边图——不是字符串匹配,而是语义解析的引用。

这意味着您的代理可以通过6个间接级别跟踪方法调用,并准确知道可以访问哪些代码,而无需读取单个文件。

工具: find_usages, find_callees (与 depth 用于呼叫树), find_entry_points

接口调度解决方案

在依赖注入的代码库中, service.Process() 可以指5个具体实现中的任何一个。Grep找到了接口方法。Synapps找到接口方法 和 每一个具体的实现都是自动的。

工具: find_usages, find_implementations

影响分析

在您的代理更改方法之前,它应该知道:有多少地方调用它,测试是否覆盖它,以及它依赖于什么。 analyze_change_impact 在一个单一的、令牌高效的响应中回答所有三个问题,分为直接调用者、传递调用者、测试覆盖率和下游调用者。

工具: get_context_for (与 scope="impact"), find_usages (与 include_test_breakdown), get_context_for (与 scope="edit")

范围上下文

get_context_for 是理解任何符号的推荐起点。您的代理不会读取整个文件,而是获得它所需的上下文:

  • structure --带成员签名的类型概述(无方法体)
  • method --源代码+接口契约+被调用者+依赖关系
  • edit --具有线路号、相关依赖关系、测试覆盖率的呼叫者
  • impact --爆炸半径分析:直接呼叫者、传递呼叫者、测试覆盖率、被呼叫者

工具: get_context_for

自动图形同步

图表保持新鲜,无需人工干预。当 auto_sync 启用(默认)后,每次工具调用都会检查代码库是否已更改,并仅对更改的文件重新索引。对于较长的会话, watch_project 实时更新图形。

工具: sync_project, list_projects (与 path 用于索引状态)

HTTP端点跟踪

Synapps通过检测服务器端端点定义和客户端HTTP调用,按路由模式进行匹配,来跟踪跨语言边界的HTTP依赖关系。

语言 服务器框架 客户端库
C# ASP。NET核心([ApiController], [Route], [HttpGet/Post/Put/Delete]) HttpClient,RestSharp
TypeScript/JavaScript Express,NestJS axios,fetch
Python Flask、Django、FastAPI 请求
Java Spring Boot(@RequestMapping, @GetMapping等),JAX-RS RestTemplate,WebClient,java.net.http

工具: find_http_endpoints (使用 trace=True 对于完整的依赖关系图片)

已知限制: 动态URL构建(运行时字符串串联、构建器模式)和API网关/中间件路由重写无法通过静态分析来解决。

令牌高效输出

输出使用缩短的符号引用、相对文件路径和紧凑的Markdown摘要,而不是原始JSON——在保留代理所需的所有信息的同时减少了令牌消耗。

多语言支持

C#、Python、Types/JavaScript和Java项目都使用相同的工具、图模式和查询模式。语言检测是基于文件扩展名自动进行的,也可以通过显式指定 --language.

语言 文件扩展名 语言服务器
C .cs Roslyn语言服务器
python .py 吡啶
Types/JavaScript .ts, .tsx, .js, .jsx, .mts, .cts, .mjs, .cjs 打字语言服务器
Java .java Eclipse JDTLS

网络查看器

Synapps包含一个内置的web UI,它通过MCP向AI代理提供相同的工具,因此您可以准确地看到代理看到的内容。webviewer提供对所有查询工具的交互式访问,以及用于探索符号邻域的力导向图可视化。

能力:

  • 搜索 --在索引项目中按名称查找符号
  • 导航 --直接从UI跟踪用法、被调用者、层次结构和作用域上下文
  • 分析 --查看架构概述、死代码和未经测试的方法
  • 探索 --将符号邻域可视化为具有可配置深度、物理模拟和布局控件的交互式图形
  • 查询 --运行原始Cypher查询并浏览HTTP端点

webviewer对于直观地了解代码如何连接非常有用,特别是在进入新代码库或调查复杂的调用链时。


CLI 参考

synapps <command> [args]

设置

命令 描述
synapps init [path] 交互式安装向导--检测语言、检查先决条件、索引项目、配置MCP客户端
synapps doctor 检查环境:Docker、Memgraph和所有语言服务器依赖项

项目管理

命令 描述
synapps index <path> [--language <lang>] 为项目建立索引(如果省略,则自动检测语言)
synapps sync <path> 仅重新索引已更改的文件
synapps watch <path> 注意文件更改并保持图形更新(运行到Ctrl+C)
synapps delete <path> 删除项目及其所有图形数据
synapps status [path] 显示一个项目的索引状态,或列出所有索引项目

图形查询

命令 描述
synapps symbol <full_name> 获取符号的节点和关系
synapps source <full_name> [--include-class] 打印符号的源代码
synapps search <query> [--kind <kind>] [-l <lang>] 按名称搜索符号
synapps callers <method> [--include-tests] [--tree] 查找方法的所有调用者
synapps callees <method> [--tree] 查找某个方法调用的所有方法
synapps implementations <interface> 查找具体实现
synapps hierarchy <class> [--tree] 显示继承链
synapps usages <full_name> [--include-tests] 查找所有使用符号的代码
synapps dependencies <full_name> [--tree] 查找符号引用的所有类型
synapps context <full_name> [--scope <scope>] [--max-lines <n>] 获取理解/修改符号的上下文
synapps trace <start> <end> [-d <n>] [--tree] 跟踪两个方法之间的调用路径
synapps entry-points <method> [-d <n>] [--include-tests] [--tree] 查找达到方法的API/控制器入口点
synapps query <cypher> 执行只读Cypher查询

摘要

为符号附加不可衍生的上下文——设计原理、约束、所有权、弃用计划。不要将这些用于结构描述;该信息可通过实时查询 get_context_for, find_dependencies等等。

命令 描述
synapps summary get <full_name> 获取某个符号的摘要
synapps summary set <full_name> <content> 设置符号的摘要
synapps summary list [--project <path>] 列出所有符号及其摘要

MCP工具

连接到的任何MCP客户端都可以使用19个工具 synapps-mcp,分为9类。

项目管理

工具 参数 说明
index_project path, language? 为项目建立索引
list_projects path? 列出索引项目或详细状态 path 提供
sync_project path 增量同步--仅重新索引已更改的文件

符号发现

工具 参数 说明
search_symbols query, kind?, namespace?, file_path?, language?, limit? 使用过滤器按名称查找符号
find_implementations interface_name, limit? 接口的具体实现
get_hierarchy class_name 完整继承链

调用图

工具 参数 说明
find_callees method_full_name, include_interface_dispatch?, limit?, depth? 查找被叫者; depth 启用调用树模式
find_usages full_name, exclude_test_callers?, limit?, kind?, include_test_breakdown? 统一使用查找——按符号类型自动选择(替换find_callers)
find_entry_points method, max_depth?, exclude_pattern?, exclude_test_callers? 查找API/控制器入口点

背景和影响分析

工具 参数 说明
get_context_for full_name, scope?, max_lines? 理解/编辑/影响分析的背景。范围: structure, method, edit, impact
find_dependencies full_name, depth?, limit? 具有可选传递遍历的字段类型依赖关系

代码智能

工具 参数 说明
get_architecture path, limit? 单调用架构概述:包、热点方法(按入站调用者计数)、HTTP服务映射和摘要统计
find_dead_code path, exclude_pattern? (实验) 查找入站调用者为零的方法。默认情况下不包括测试方法、HTTP处理程序、接口实现、调度目标、构造函数和重写
find_tests_for path, method_full_name (实验) 通过测试边缘找到直接覆盖生产方法的测试方法。通过解析支持的短名称
find_untested path, exclude_pattern? (实验) 查找没有测试覆盖率(没有入站测试边缘)的生产方法。排除逻辑与 find_dead_code

HTTP端点

工具 参数 说明
find_http_endpoints route?, http_method?, language?, trace? 按路线、方法或语言搜索端点。使用 trace=True 查看完整的服务器+客户端依赖关系图

建筑

工具 参数 说明
get_architecture path, limit? 项目概述:包、热点、HTTP地图、统计数据

代码质量

工具 参数 说明
find_dead_code path, limit? (实验) 零调用者的方法(不包括测试、HTTP处理程序、接口impls、构造函数、重写)
find_tests_for method_full_name (实验) 通过tests边查找哪些测试涵盖了一种方法
find_untested path, limit? (实验) 无测试覆盖的生产方法

摘要

工具 参数 说明
summary action, full_name?, content?, project_path? 在符号上保持不可导的上下文

原始查询

工具 参数 说明
get_schema -- 全图模式:标签、属性、关系
execute_query cypher 只读密码查询

容器管理

Synapps使用Memgraph作为其图形数据库,通过Docker进行管理。默认情况下,为了简单起见,所有项目共享一个容器。

模式 何时使用 容器 配置
共享 (默认) 大多数用户 一个 synapps-shared 7687港集装箱 ~/.synapps/config.json
专注的 每个项目需要隔离 每个项目一个容器,动态端口 .synapps/config.json 在项目根中
外部 BYO Memgraph 无容器--直接连接 ~/.synapps/config.json

在共享模式下,每个项目的数据由其 Repository 图中的节点——索引项目A对项目B没有影响。

专用集装箱

添加 "dedicated_instance": true 到项目的 .synapps/config.json:

{
  "dedicated_instance": true
}

Synapps为每个项目提供一个容器(synapps-<project-name>)在动态分配的端口上。

外部Memgraph

在中设置连接 ~/.synapps/config.json:

{
  "external_host": "memgraph.example.com",
  "external_port": 7687
}

外部模式下不需要Docker。

管理容器

docker ps --filter "name=synapps-"     # List Synapps containers
docker stop synapps-shared              # Stop the shared container

容器在会话中持续存在,如果停止,会在下一个命令中自动重新启动。

全局配置位于 ~/.synapps/config.json.根据项目配置(.synapps/config.json)仅在使用专用容器时创建。添加 .synapps/ 到你的 .gitignore.


图形模型

节点标签

结构性的 (由 path): :Repository, :Directory, :File

符号 (由 full_name): :Package, :Class (类、抽象类、枚举、记录——以 kind), :Interface, :Method (signature, is_abstract, is_static, line), :Property (type_name), :Field (type_name), :Endpoint (route, http_method, name)

A. :Summarized 标签将添加到任何附有摘要的节点上。

关系

关系 含义
CONTAINS 结构安全壳(存储库→目录→File→符号、类别→嵌套符号)
IMPORTS 文件导入包/命名空间
CALLS 方法调用另一个方法(可选 call_sites 财产)
OVERRIDES 方法重写基方法
IMPLEMENTS 类实现接口;接口的方法级别→混凝土
DISPATCHES_TO 接口方式→具体实现(方法级实现的逆)
INHERITS 类继承自类,或接口扩展接口
REFERENCES 符号引用类型(字段、参数、返回类型)
TESTS 测试方法直接涵盖了一种生产方法(源自CALLS,其中调用者是一个测试函数)
SERVES 方法处理HTTP端点
HTTP_CALLS 方法向端点发出HTTP请求(使用 call_sites)

完全限定的名称(例如。 MyNamespace.MyClass.DoWork)始终用作符号标识符。


忽略文件

地点a .synignore 项目根目录中的文件,用于从索引中排除路径(.gitignore 语法):

worktrees/
generated/
vendor/
*.generated.cs
**/test_data/**

没有 .synignore,Synapps使用内置排除(.git, node_modules, __pycache__, dist, build等等)。


预工具挂钩

Synapps可以安装咨询性的预工具挂钩,提醒AI代理在回到grep和文件搜索之前使用图形工具。钩子是非阻塞的——它们向stderr发出提醒,但从不阻止工具调用。

在以下过程中安装挂钩 synapps init 对于任何检测到的代理。它们是索引感知的:只有当当前项目有 .synapps/config.json (即已编入索引)。

支持的代理

代理 钩子事件 匹配器 配置文件
克劳德代码 PreToolUse Grep|Glob ~/.claude/settings.json
光标 preToolUse Read ~/.cursor/hooks.json
GitHub副本 preToolUse 内部(过滤器 toolName 在脚本中) .github/hooks/hooks.json

运作原理

Gate脚本安装在 ~/.synapps/hooks/:

  • common.sh --共享助手:从 $PWD 向上寻找 .synapps/config.json;如果发现stderr,则向其发出提醒
  • claude-gate.sh / cursor-gate.sh --来源 common.sh,检查索引,发出提醒,退出0
  • copilot-gate.sh --相同,但也读 toolName 从stdin JSON到过滤搜索相关工具,并发出 {"permissionDecision":"allow"} 在stdout上(Copilot协议要求)

手动吊钩拆卸

要移除挂钩,请删除 ~/.synapps/hooks/ 并从每个代理的配置文件中删除Synapps条目。Synapps条目可通过包含以下内容的脚本路径进行识别 ~/.synapps/hooks/.


AI代理配置

Synapps通过协议自动向符合MCP的客户端提供使用说明——大多数代理都能开箱即用地做出良好的工具选择。

下面的片段是 可选的 为您的AI平台规则文件添加。它强化了工具选择模式,并增加了MCP协议所提供的指导。

Recommended rules content
## Synapps MCP

Use Synapps MCP tools for code navigation instead of grep or file reads.

### Workflow
- Projects must be indexed before querying. Use `list_projects` to check, `index_project` to index, `sync_project` to refresh.
- If queries return empty results, use `list_projects(path=...)` to verify the project is indexed.

### Before editing code
- Call `get_context_for` with `scope="edit"` to see callers, dependencies, and test coverage.

### Tool selection
- Find symbols: `search_symbols` (with kind/namespace/file_path/language filters)
- Symbol metadata and source code: `get_context_for` (scopes: `structure`, `method`, `edit`, `impact`)
- Callers / all usages: `find_usages` (auto-selects by kind; `include_test_breakdown` for prod/test split)
- Callees: `find_callees` (use `depth` for call tree)
- Entry points: `find_entry_points`
- Implementations: `find_implementations` | Inheritance: `get_hierarchy`
- Dependencies: `find_dependencies` (use `depth` for transitive)
- Impact analysis: `get_context_for` with `scope="impact"`
- Architecture overview: `get_architecture` (packages, hotspots, HTTP map, stats in one call)
- Dead code *(experimental)*: `find_dead_code` (methods with zero callers, use `exclude_pattern` for additional filtering)
- Test coverage *(experimental)*: `find_tests_for` (which tests cover a method) and `find_untested` (methods with no test coverage)
- HTTP endpoints: `find_http_endpoints` (use `trace=True` for full dependency picture)
- Annotations: `summary` (set/get/list) for non-derivable context
- Raw Cypher: `get_schema` then `execute_query` (last resort)

### Anti-patterns
- Don't guess symbol names — use `search_symbols`
- Don't use `execute_query` when a dedicated tool exists
- Don't read files with grep when `get_context_for` works
- Don't skip `get_context_for` with `scope="edit"` before modifying a method

在哪里添加:

平台 文件
克劳德代码 CLAUDE.md 在项目根中
光标 .cursor/rules/synapps.mdc (套 alwaysApply: true 正面)
风帆冲浪 .windsurfrules
GitHub副本 .github/copilot-instructions.md

对于Cursor的 .mdc 格式化,将内容包装在frontmatter中 description 和 globs 领域。对于VS代码/副本,MCP服务器配置(.vscode/mcp.json)与规则文件分开。


发展

python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

# Unit tests (no Docker, Memgraph, or .NET required)
pytest tests/unit/

# Integration tests (requires Docker + Memgraph on localhost:7687)
docker compose up -d
pytest tests/integration/ -m integration