mcpField
G
Gossiphs

Gossiphs

远程服务
github.com/williamfzc开发工具10131 周前更新
代码仓库

关于 Gossiphs

Gossiphs 是一个基于 tree-sitter 与 Git 历史分析代码文件之间关系的工具,无需额外配置即可运行。它面向需要低成本代码导航和影响分析的开发者,并提供 Python SDK、CLI 与 MCP 服务。

主要功能

  1. 01基于 tree-sitter 分析文件间关系
  2. 02结合 Git 提交历史优化关联边
  3. 03无需仓库级配置
  4. 04支持 Rust、Python、TypeScript 等多种语言
  5. 05提供 Python SDK 与命令行工具

适用场景

  1. 01分析代码变更的影响范围
  2. 02在 CI 中查看文件依赖关系
  3. 03为代码浏览生成文件关系图

MCP 相关

该项目提供 MCP 服务,可向 MCP 客户端暴露代码文件关系分析能力。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址http://127.0.0.1:8000/sse
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

详细介绍

Gossiphs = Gossip Graphs

提示

面向 AI:使用 gossiphs skill,在任何 AI 助手中分析代码关系。

另有:Python SDK 和 MCP 服务

Crates.io Version RealWorld Test

“零配置”且“快如闪电”的代码文件关系分析。基于 tree-sitter 和 Git 历史。

简介

Gossiphs 可以分析提交历史,以及代码库中变量声明与引用之间的关系,从而生成代码文件关系图。

它还允许开发者查询每个文件中声明的内容,以便在整个代码库中自由搜索其引用,实现更复杂的分析。

graph TD
    A[main.py] --- S1[func_main] --- B[module_a.py]
    A --- S2[Handler] --- C[module_b.py]
    B --- S3[func_util] --- D[utils.py]
    C --- S3[func_util] --- D
    A --- S4[func_init] --- E[module_c.py]
    E --- S5[process] --- F[module_d.py]
    E --- S6[Processor] --- H[module_e.py]
    H --- S7[transform] --- I[module_f.py]
    I --- S3[func_util] --- D

支持的语言

我们基于 Tree-Sitter Query 扩展语言支持,成本并不高。 如果你感兴趣,可以查看贡献部分。

语言状态
Rust✅
Python✅
TypeScript✅
JavaScript✅
Golang✅
Java✅
Kotlin✅
Swift✅
C#✅

你可以在此查看规则文件。

用法

Python
pip install gossiphs

只需 30 行代码,即可使用 networkx 分析代码库:

import networkx as nx
from gossiphs import GraphConfig, create_graph, Graph

config = GraphConfig()
config.project_path = "../.."
graph: Graph = create_graph(config)

nx_graph = nx.DiGraph()

for each_file in graph.files():
    nx_graph.add_node(each_file, metadata=graph.file_metadata(each_file))

    related_files = graph.related_files(each_file)
    for each_related_file in related_files:
        related_symbols = set(each_symbol.symbol.name for each_symbol in each_related_file.related_symbols)

        nx_graph.add_edge(
            each_file,
            each_related_file.name,
            related_symbols=list(related_symbols)
        )

print(f"NetworkX graph created with {nx_graph.number_of_nodes()} nodes and {nx_graph.number_of_edges()} edges.")

for src, dest, data in nx_graph.edges(data=True):
    print(f"{src} -> {dest}, related symbols: {data['related_symbols']}")

输出:

NetworkX graph created with 13 nodes and 27 edges.
src/server.rs -> src/main.rs, related symbols: ['server_main']
src/main.rs -> src/graph.rs, related symbols: ['default']
src/main.rs -> examples/mini.rs, related symbols: ['default']
src/main.rs -> src/server.rs, related symbols: ['main']
src/symbol.rs -> src/graph.rs, related symbols: ['link_file_to_symbol', 'list_references', 'list_references_by_definition', 'id', 'enhance_symbol_to_symbol', 'add_file', 'add_symbol', 'list_definitions', 'list_symbols', 'new', 'link_symbol_to_symbol', 'get_symbol']
...

更多示例请见此处。

其他

我们还提供 CLI 和其他使用选项,方便你直接导出 CSV 文件或启动 HTTP 服务。

请参阅用法页面。

目标与动机

提示

创建文件关系索引,具备以下特点:

  • 成本低
  • 精度可接受
  • 高度通用,适用于几乎任何代码仓库

代码导航是一个引人入胜的主题,在多个领域发挥着关键作用,例如:

  • 在 IDE 中的开发过程中引导上下文。
  • 让网站上的代码浏览更加便捷。
  • 在持续集成(CI)系统中分析代码变更的影响。
  • ...

过去,我曾尝试将 LSP/LSIF 技术和 GitHub 的 Stack-Graphs 等技术应用于影响分析,并在过程中遇到了各种挑战。对于我们的需求,类似 Stack-Graphs 的方法最符合预期。 然而,挑战显而易见:这种方法需要编写高度特定于语言的规则。对我们而言,这是一项相当大的投入,因为我们并不需要如此高精度的数据。

我们尝试针对 stack-graphs 目前面临的挑战做出一些权衡,在一定程度上实现预期目标:

  • 零仓库专属配置:无需额外配置,即可应用于大多数语言和代码仓库。
  • 扩展成本低:为语言添加规则的成本不高。
  • 精度可接受:我们牺牲了一定的精度,但也希望精度保持在可接受的水平。

工作原理

Gossiphs 构建一个图,将定义和引用中的符号相互连接。

  1. 提取导入和导出:识别每个文件的导入和导出。
  2. 连接节点:在潜在的定义节点和引用节点之间建立连接。
  3. 根据提交历史细化边:利用提交历史细化节点之间的关系。

与 stack-graphs 不同,我们省略了高度复杂的作用域分析,转而使用提交历史来细化边。 这种方法显著降低了规则编写的复杂度,因为规则只需指定每个文件应导出或导入哪些类型的符号。

虽然这无疑需要在精度上做出取舍,但其优势显而易见:

  1. 对准确率的影响极小:在实际场景中,精度损失并没有预期的那么显著。
  2. 提交历史的相关性:使用提交历史来反映代码片段之间的影响,与我们的目标十分契合。
  3. 语言支持:我们可以轻松支持绝大多数编程语言,满足各种类型代码仓库的分析需求。

精度

静态分析有其局限性,例如动态绑定。 因此,它不太可能达到 LSP 提供的准确度,但在其主要应用领域可以提供足够的准确度。

我们通过将结果与 LSP/LSIF 的结果进行比较来展示准确度。必须承认,静态推断几乎不可能像 LSP 那样获得所有引用关系。

你可以结合自己的需求,进一步使用 tfidf 等其他方法处理结果,以满足更复杂的需求。

RepoGossiphs 对 LSP 边的覆盖率
https://github.com/go-gorm/gorm442/499 = 88.5 %
https://github.com/gin-gonic/gin238/252 = 94.4%

贡献

该项目仍处于非常早期的实验阶段。如果你感兴趣,请通过 issue 分享你的想法。短期内,我们希望为更多语言构建更好的支持。

你只需:

  1. 编辑 src/rule.rs 中的规则
  2. 在 src/extractor.rs 中进行测试
  3. 在 src/graph.rs 中使用你的代码仓库进行尝试

Tree-sitter Playground 是一个很好的辅助工具。

许可证

Apache 2.0

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。