Code-Graph-RAG 功能演进全览:从 NEWS.md 读懂多语言代码知识图谱的 20 项核心能力
【免费下载链接】code-graph-ragThe ultimate RAG for your monorepo. Query, understand, and edit multi-language codebases with the power of AI and knowledge graphs项目地址: https://gitcode.com/GitHub_Trending/co/code-graph-rag
Code-Graph-RAG 以 Tree-sitter 解析多语言代码库,在 Memgraph 中构建统一图模式的知识图谱,并支持自然语言查询、编辑与优化。本文以仓库的 NEWS.md 为骨架,逐条梳理其最新功能演进:从 14 种语言支持、cgr trace运行时调用追踪、FLOWS_TO数据流分析,到 protobuf 索引、事务性多文件编辑与 MCP 工具矩阵,并结合 scripts/update_news.py、scripts/generate_readme.py 等源码,讲清每条新闻背后的实现机制与实战用法。读完你将掌握该项目的完整能力地图,以及 NEWS.md 如何成为 README「Latest News」的唯一事实源。
NEWS.md 是什么:项目的功能新闻中枢
NEWS.md 是 Code-Graph-RAG 面向用户的功能发布记录,采用「最新在前」的倒序排列。它记录的不是CI、开发工具、构建自动化、重构、文档、测试或缺陷修复,而是用户可感知的核心能力:新语言支持、分析能力、查询能力、图能力与集成能力。文件头部明确写有此约定,并在 scripts/update_news.py 的NON_FEATURE_THEME正则中落地为强制过滤规则(automation|releases?|ci|cd|tooling|refactor|chore|docs|tests?|benchmarks?|perf等主题一律被丢弃,防止非功能条目流入 README)。
文件中有一个关键标记:
<!-- latest-release-end -->该标记划定了「最新一次发布」的条目范围,是新闻渲染的边界线。
新闻如何生成与渲染:一文件两脚本的流水线
发布时:scripts/update_news.py插入新条目
发布工作流调用 scripts/update_news.py,把发布生成的「Highlights」片段转换为 NEWS.md 标准条目格式- **主题**: 描述:
- 解析并规范化:接受
-与*两种列表标记,接受**主题:**与**主题**:两种冒号位置,统一输出为- **主题**: 描述;em-dash/en-dash 一律归一化为连字符(_normalize_dashes)。 - 主题去重:按主题词(casefold 后)与已有条目去重,同一发布重复执行是幂等的(
existing_themes+prepend_news)。 - 移动到标记:把
<!-- latest-release-end -->移到新插入块之下,使 README 能渲染整个最新发布块,而非固定 top-N。 - 失败即报错:若片段中全是形似条目的行但一条都没解析成功,退出码为 1 并打印告警,避免「生成器格式与解析器漂移」这类静默失败(源码注释中记录了 v0.0.820 全部条目因
**Theme:**写法未解析的历史问题)。 - 聚合兜底:当所有高亮都被功能过滤时,回退生成一条
**Release Summary**聚合条目,保证每个发布至少留一条新闻。
脚本仅依赖标准库,可在项目环境同步之前于发布流程中运行。
渲染时:scripts/generate_readme.py同步到 README
scripts/generate_readme.py 将 README.md 的Latest News章节作为 SECTION 占位符,调用codebase_rag.readme_sections包的generate_all_sections()生成内容后回填。其中 format_latest_news 读取 NEWS.md,统计latest-release-end标记之上的条目数并整体渲染;若标记缺失则回退到顶部 3 条。因此:
NEWS.md 是唯一事实源,README 只是它的渲染结果。任何手工编辑都应写进 NEWS.md,而不是 README。
同时LATEST_RELEASE_MARKER常量在scripts/update_news.py与codebase_rag/readme_sections.py两处重复定义,且有测试断言两者永不漂移。
最新发布亮点(标记之上)
标记之上的 6 条代表当前最新发布:
- 文件系统操作:平台无关的路径拼接(platform-neutral joins),并加装了「禁止删除项目根目录」的保护;
- 缓存管理:原子发布(atomic publishing)、专用缓存戳(cache stamps)、改进孤儿缓存的删除处理;
- 图查询:引入确定性图查询工具,让代码关系的分析结果可复现;
- 重新摄取与解析:处理已删除文件、重解析关联文件、重建关键数据结构;
- 安全与稳定性:阻止删除项目根、防止编辑被跳过(skipped edits)、处理孤儿缓存;
- C++ 与 Go 集成:解析模块接口(module interfaces)、处理模块级类别名(module-level class aliases)。
「禁止删除项目根」的安全保护可在 codebase_rag/constants/security.py 与相关文件系统操作模块中找到对应实现,属于摄取管线对灾难性误操作的前置防线。
语言支持演进:从 6 种到 14 种及可插拔扩展
NEWS.md 记录了语言支持的关键节点:
- C# 与 Dart:C#(含 Roslyn 语义分析)与 Dart/Flutter 加入图谱,总数达到14 种。完整矩阵见 docs/architecture/language-support.md。
- Ruby:通过一个新的可插拔 ast-grep 层加入图谱——仅凭一个 YAML 模式文件即可为语言生成
Module、Function、Class节点及 import 边,无需手写解析器。这验证了 codebase_rag/analyzers/ast_grep_rules/(45 个 YAML 规则)与 codebase_rag/analyzers/ast_grep_analyzer.py 组成的规则驱动管线,相关测试见 test_ast_grep_tier.py 与 test_ast_grep_tier_languages.py。 - C++ 与 Go 增强:解析模块接口、处理模块级类别名,提升了这两个重度多范式语言的图覆盖质量。
README 的「Supported Languages」章节(同样由generate_readme.py生成)补充说明:Ruby、Kotlin、Swift、Elixir、Haskell、Solidity、Bash、Nix 等语言具备基于 ast-grep 的结构化支持(模块、函数、类与 import)。
运行时调用追踪:cgr trace让静态盲区显形
NEWS.md 中最重磅的条目之一:动态运行时追踪。系统运行你的代码(通常是测试套件),把真实发生的调用以CALLS边合并进图谱,静态分析漏掉的调度——接口分发、虚方法、函数指针、反射、框架路由——全部变得可见。
# 将一次运行(测试套件等)转换为调用追踪并合并入图 cgr trace # 或摄取生产环境的 pprof 剖析数据(来自 eBPF 持续剖析器,如 Parca、Pyroscope、OpenTelemetry) cgr trace convert --format ebpf支持转换的运行来源覆盖Python、JVM、Node.js、.NET、PHP、Lua、Dart、Go、Rust、C/C++十类运行时。实现位于 codebase_rag/trace/cli.py(CLI 入口)、codebase_rag/constants/trace.py,并配套完整的 trace 子目录(含 C 侧 shimcgr_trace_shim.c、Dart 收集器、pprof/speedscope 转换等);CLI 注册与帮助见 codebase_rag/cli.py 与 codebase_rag/cli_help.py。相关测试覆盖 CLI、speedscope、各语言解析与摄取,例如 test_dynamic_trace_cli.py、test_dynamic_trace_ebpf.py。
数据流追踪:FLOWS_TO污染边覆盖 10 种语言
NEWS.md 记录了图模式新增的FLOWS_TO污染追踪边:值流经赋值、函数调用与 I/O 汇点(sink)的路径都会被建模。本发布为C#、Java、C、Go补上追踪,加上 Python、JavaScript、TypeScript/TSX、Go、Java、Rust、C++、C、C# 使总数达到10 种语言。
在源码侧,FLOWS_TO常量定义于 codebase_rag/constants/graph.py,追踪逻辑分布在 codebase_rag/taint.py、codebase_rag/flow_verdict.py、codebase_rag/parsers/flow_access/ 与 codebase_rag/parsers/io_access/,Cypher 查询模板见 codebase_rag/cypher_queries.py。专项测试包括 test_flow_edges.py、test_flow_lean_transitive_return.py、test_flow_csharp_edges.py、test_io_libc_edges.py 等,覆盖多语言的值选择、分支与跨调用链传递。
Java 侧另有专门的污染改进:JDK shims、链式调用接收者、字面量参数与类型测试模式(type-test patterns)都被纳入追踪(相关测试如 test_java_variable_analyzer_integration.py);C# 侧则细化了参数绑定、元组解构与 await 管道方法的传播。
结构化搜索与替换:ast-grep 工具化
NEWS.md 宣布结构化搜索与替换:通过 ast-grep 按 AST 模式查找与重写代码,并以 Agent 工具的形式暴露——跨整个代码库做结构匹配与变换,不再依赖文本或正则。
这对应 codebase_rag/analyzers/ast_grep_analyzer.py 及其规则集 codebase_rag/analyzers/ast_grep_rules/(45 个 YAML 规则),测试见 test_ast_grep_analyzer.py 与 test_ast_grep_service.py。此外,结构分析还支持对另外七种语言做 ast-grep 解析,并与 protobuf 索引之间做结构化快照差异对比(structural snapshot diffs)。
图检索与查询能力增强
多条新闻围绕图检索与查询:
- 确定性图查询工具:引入确定性的图查询工具,使代码关系分析结果可精确复现;
- 图索引:
name属性被索引以加速图读路径查找;SQL 例程(routines)也被索引,从而解析出以字符串命名目标的调用; - 边定位信息:调用点(call-site)与导入点(import-site)的位置现在存储在图的边(edge)上,回答「谁在哪一行调用了谁」不再需要二次回源;
- 项目作用域:MCP 与 CLI 的图检索被限定在单个项目内(project-scoped),避免跨项目串扰;
- 调用方落点:
caller_qn等落点信息在图谱中持续完善(如 Java、C++ 的调用方命名空间解析,见 test_java_call_caller_qn.py 等)。
这些能力沉淀在 codebase_rag/cypher_queries.py、codebase_rag/graph_query.py、codebase_rag/graph_audit.py 中。
重复代码检测:AST 级查重
NEWS.md 宣布引入基于 AST 的重复代码检测系统,并修复了跨多个仓库场景下的重复检测问题。CLI 侧对应cgr duplicates命令族,核心实现在 codebase_rag/duplicates.py,并作为 MCP/Agent 工具暴露(见下节)。测试覆盖收集、命令、评估与工具四个维度:test_duplicates_collect.py、test_duplicates_command.py、test_duplicates_eval.py、test_duplicates_tool.py。
MCP 与 Agent 工具矩阵
- 直接 MCP 工具:
find_duplicate_code与get_function_source以直接 MCP 工具形式暴露,PHP 的use function导入也能通过声明的命名空间解析。工具注册见 codebase_rag/mcp/tools.py 与 codebase_rag/constants/mcp.py。 - MCP 索引一致性:MCP 的 index/update 流程遵循
.cgrignore与.gitignore(与 CLI 一致),排除规则不再因入口不同而分叉(相关测试 test_cgrignore.py、test_exclude_patterns.py)。 - 排除集记录:索引时记录排除集,确保
--exclude标志在多次运行间一致生效。
MCP 服务端整体结构见 docs/guide/mcp-server.md。
事务性多文件编辑与语言相关修复
- 事务性多文件编辑:多文件编辑以事务方式执行,带分阶段校验(staged verification)与撤销(undo);每个语言配备保留具体语法的 patcher,重命名与移动(rename/move)时自动重写 import。核心实现在 codebase_rag/editing/transaction.py、codebase_rag/editing/patcher.py、codebase_rag/editing/imports.py,契约定义见 codebase_rag/editing/contract.py,测试见 test_edit_transaction.py、test_edit_contract.py、test_import_rewrite.py。
- 补丁报告:区分「不可验证」与「已验证」的补丁,让 Agent 的编辑结果更可信。
- Scala 继承:Scala 的
INHERITS边从extends/with子句读取;Markdown front-matter 被读入Module节点。
索引、完整性与增量一致性
- Protocol Buffer 索引:引入规范化的 protobuf 索引,带 provenance 清单(provenance manifest)与
verify校验命令,保证数据完整性。实现见 codebase_rag/services/protobuf_service.py 与 protobuf 定义 codec/schema.proto。 - 结构快照差异:protobuf 索引与结构分析之间可做快照差异(structural snapshot diffs),用于检测索引漂移。
- 索引一致性:增量删除与干净索引状态保持一致(incremental deletes match clean index states),相关测试 test_incremental_deleted_state.py、test_incremental_deleted_dependents.py。
- 缓存管理:原子发布缓存、专用缓存戳与孤儿缓存清理,相关基准见 benchmarks/bench_ast_cache.py、benchmarks/bench_embedding_cache.py。
- 语义前端:新增进程内(in-process)Jedi 语义前端用于 Python,并在监视路径上重跑语义前端以获得更准确的分析。
评估与质量基建
- Agentic QA:新增 Agentic QA 基准测试框架(harness)与索引期基准(indexing-time benchmark),见 evals/agentic_qa.py 与 benchmarks/bench_indexing.py。
- TypeScript 评分:TypeScript 继承关系对照 tsc oracle 评分,提升准确率(相关 eval 见 evals/ts_l1.py)。
- Windows 清理:删除临时仓库前清除只读位,保证 Windows 环境的 teardown 成功。
给维护者的使用约定
如果你想为项目贡献一条新闻:
- 编辑 NEWS.md,在
<!-- latest-release-end -->之上追加- **主题**: 一句话描述; - 主题必须指向用户可见的功能(语言支持、分析、查询、图、集成),禁止 CI/工具链/重构/文档/测试/缺陷修复类主题;
- 运行
python scripts/generate_readme.py,脚本会把标记之上的所有条目渲染进 README 的Latest News章节; - 发布时由工作流调用
python scripts/update_news.py <bullets-file>自动前置新条目并移动标记。
结语
从 NEWS.md 的 20 余条记录可以勾勒出 Code-Graph-RAG 的完整能力版图:以 Tree-sitter + ast-grep 双层解析支撑 14+ 种语言的统一图谱,用cgr trace动态追踪补全静态分析盲区,用FLOWS_TO建立 10 种语言的跨语言数据流追踪,再通过事务性编辑、protobuf 索引、确定性图查询与 MCP 工具矩阵,把「读代码 - 查代码 - 改代码」闭环成可被 Agent 直接驱动的工程能力。配合 scripts/update_news.py 与 scripts/generate_readme.py 构成的新闻流水线,每次发布的功能演进都被稳定沉淀为 README 中机器可读的「Latest News」——这正是观察该项目演进节奏与能力边界的最佳入口。
【免费下载链接】code-graph-ragThe ultimate RAG for your monorepo. Query, understand, and edit multi-language codebases with the power of AI and knowledge graphs项目地址: https://gitcode.com/GitHub_Trending/co/code-graph-rag
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考