nguyenminhduc9988/graphscout

GitHub: nguyenminhduc9988/graphscout

GraphScout 为 AI 编程代理提供带缓存的增量代码图索引,使其能直接查询代码结构而非读取整个文件。

Stars: 0 | Forks: 0

graphscout — query code structure, don't read whole files
[![PyPI](https://img.shields.io/pypi/v/graphscout.svg?color=7ee7c7&label=PyPI&logo=pypi&logoColor=white)](https://pypi.org/project/graphscout/) [![Python](https://img.shields.io/pypi/pyversions/graphscout.svg?color=7ee7c7&logo=python&logoColor=white)](https://pypi.org/project/graphscout/) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/39/39faa54be350a1dab8afd3b2fb8c1c83e4d9cff84abfef2374d19a18053687c4.svg)](https://github.com/nguyenminhduc9988/graphscout/actions/workflows/ci.yml) [![Downloads](https://img.shields.io/pypi/dm/graphscout.svg?color=a5b4fc&logo=pypi&logoColor=white)](https://pypi.org/project/graphscout/) [![License: MIT](https://img.shields.io/badge/License-MIT-c4b5fd.svg)](LICENSE) [![MCP](https://img.shields.io/badge/MCP-ready-7ee7c7.svg?logo=anthropic&logoColor=white)](#-mcp-wired-automatically) [![Stars](https://img.shields.io/github/stars/nguyenminhduc9988/graphscout.svg?style=social)](https://github.com/nguyenminhduc9988/graphscout/stargazers) [![Typing SVG](https://readme-typing-svg.demolab.com/?font=Fira+Code&weight=600&size=19&pause=1000&color=7EE7C7¢er=true&vCenter=true&width=720&lines=Where+is+this+defined%3F+%E2%80%94+one+call.;Who+calls+this%3F+%E2%80%94+one+call.;What+breaks+if+I+change+it%3F+%E2%80%94+one+call.;Cached+~+incremental+~+zero+API+keys.)](https://github.com/nguyenminhduc9988/graphscout)
安装   接入 MCP   基准测试
graphscout explore / search / impact demo — real, verified CLI output
▲ Real captured CLI output, not mockups — every line comes from an actual graphscout run on this repo.

75% fewer tool calls · 1 call vs 4 · 21/21 tests passing
Measured, not asserted — see Benchmark for methodology and how to reproduce it yourself.

每个代码库只需执行一次 `build`;之后,每次查询只会自动刷新自上次调用以来发生更改的文件(基于 mtime)。没有强制后台进程,没有外部数据库,也没有 API 密钥 —— 只需在 `~/.cache/graphscout` 下使用 JSON 缓存,并按需在内存中构建 SQLite FTS5 索引用于搜索。希望它始终保持最新且没有单次查询开销?运行 `graphscout watch` 即可。 曾以 codegraph-kit(代码库 codegraph)名称发布 —— 为避免与毫不相关且庞大得多的 colbymchenry/codegraph 混淆而重命名。缓存格式相同($CODEGRAPH_CACHE 仍然有效)。请参阅 客观对比,了解每款工具各自胜出的确切领域。 ## 🆕 0.6.0 版本更新 六种基于图的新功能 —— 这些答案两个 codegraph 都无法提供,每一项都建立在 graphscout 已经提取的数据之上,而不是重新解析一次: - **`metrics [query]`** —— 每个符号的复杂度卡片:**fan-in**(有多少地方调用它 —— 承载核心功能)、**fan-out**(有多少个不同的被调用者 —— 复杂度的代理指标)、进/出的引用/类型边,以及推断的函数体行数。带有名称时,显示单个符号的卡片;不带名称时,以两种方式对代码库进行排名 —— fan-out 最高(可能过大的函数)和 fan-in 最高(许多调用者依赖的中心节点)。 - **`dupes`** —— 跨文件的复制粘贴/高度相似的函数体。函数体会被标准化(去除注释、空格、大小写差异;移除声明行,因此函数体相同但名称不同的两个函数依然会被聚为一类)。调用图根本看不出这一点 —— 两个完全相同的辅助函数之间并不存在边。 - **`recent`** —— 最近 N 次提交修改过的文件中的符号。比 `diff`(需要两个明确的引用)更轻量:这是一个用于了解代码库近况的变动窗口视图,“最近有什么变化”。 - **`why `** —— 通过已解析的调用边,寻找从一个符号到另一个符号的最短调用链。这是关于双符号的“为什么 A 依赖 B”的问题,而 `impact`(从一个种子节点向外的无向影响范围)无法直接回答这个问题。 - **`tokens `** —— 单个符号函数体的 token 成本:“是值得阅读整个函数,还是先看大纲?”对于一个旨在阻止 Agent 读取整个文件的工具来说,这是最贴切的指标。如果安装了 tiktoken 则使用它 (cl100k),否则使用误差在约 15% 以内的 chars/4 启发式算法。 - **`viz --kind=imports`** —— 现有的调用图可视化现在也可以绘制**文件级的模块依赖图**(即 `cycles`/`affected`/`rdeps` 操作的底层结构图),输出为 Mermaid 或 Graphviz DOT 格式。 - `doctor` 增加了对 **tiktoken** 功能的检查,且所有六个新命令都支持 `--json` 输出和对应的 MCP 工具。 ## 🆕 0.5.0 版本更新 除了只需一次调用的 `explore` 外,graphscout 现在还可以回答底层图以前从未直接展示过的问题: - **`diff [ref2]`** —— 两个 git 引用(或一个引用与工作树)之间在符号级别的新增/移除/修改定义 —— 这是代码行差异无法提供的面向代码审查的视图:仅针对签名的重命名会显示为一个更改的符号,而不是一大块 `-`/`+` 代码行。 - **`orphans`** —— 死代码候选:在过滤掉入口点、测试和带有装饰器的处理器*并且*通过纯文本交叉检查图化(graphify)未捕获的调用风格后,代码库中没有调用者的符号(见下文)。 - **`hotspots`** —— 重构优先级排名:频繁更改(git churn)且处于结构中心(图连通性)的文件 —— 这是由 Adam Tornhill 提出的“热点”概念,直接使用 graphscout 已有的数据计算得出。 - **`routes`** —— 一次调用获取 API 表面:支持 Flask/FastAPI/Django/Express/Gin/NestJS/Spring/ASP.NET/Actix/Rails/Laravel 的路由检测。 - **`doctor`** —— 一条命令解答“为什么 search 没有排名出任何东西”或“为什么 watch 只是在轮询”:在一个地方检查 FTS5、git、mcp/watchdog 扩展以及此代码库的图健康状况。 - **`daemon start|stop|status`** —— 与 `watch` 相同的同步循环,使用 pidfile 分离到后台运行,而不是阻塞终端。 - **`roots`** —— graphscout 曾经索引过的每个代码库,包含大小和新鲜度,以便 Agent 在重新运行 `build` 之前进行检查。 - **`--json`** —— 每个查询命令都支持 `--json` —— 为脚本/CI 提供结构化输出,面向 Agent 的格式化文本依然是默认设置。 - **92 种可索引扩展名**,实时从 graphify 自己的检测器获取,而不是手动复制的列表 —— 随着 graphify 添加语言会自动增长,无需发布新的 graphscout 版本。 ## 🎯 核心理念:一次调用获取影响范围 Agent 提出的最昂贵的问题是*“如果我更改这个,什么会损坏?”* —— 通常需要逐个读取文件来回答。`graphscout impact` 会在调用图上进行双向遍历,并返回按深度排名的**整个**受影响集合:
Animated blast-radius ripple — change one symbol, see everything it touches at depth 1 and depth 2
``` graphscout impact parse_config --depth=2 # what breaks if I change this? git diff --name-only | graphscout affected --stdin # which tests does my diff touch? ``` 没有将动态分派的猜测伪装成确定性 —— 边来自于静态 AST 分析,并且当适用时,诚实的局限性会直接在输出中打印出来。 ## 📦 安装 ``` pip install graphscout # CLI pip install "graphscout[mcp]" # CLI + MCP server pip install "graphscout[watch]" # CLI + instant filesystem-event auto-sync ``` Python ≥ 3.10。解析由 [graphify](https://pypi.org/project/graphifyy/) 完成(基于 tree-sitter)。
Language coverage — 13 with full def/call/import extraction, 40+ more with outline structure
**语言覆盖范围是经过测量的,而不是随口一提的。** `graphscout` 的可索引扩展名集合(`core.CODE_EXTS`)现在直接从 graphify 自己的检测器中获取,而不是手动复制的列表,因此它会跟踪 graphify 支持的任何扩展名 —— 目前为 **92 种扩展名**。 `python scripts/lang_coverage.py` 会为每种语言构建真实的双文件样本,并检查 `calls` 边是否跨越了文件边界 —— 这与完整提取所要求的门槛相同。 是可复现的,而不是营销数字: ``` 16/20 sampled languages resolve cross-file calls: c, cpp, csharp, go, groovy, java, javascript, kotlin, php, powershell, python, ruby, rust, swift, typescript, vue same-file only: (none in this sample) no call edges at all: dart, elixir, lua, scala ``` 这是一个采样,并不是对所有 92 种扩展名的详尽审计 —— 请将其视为下限,并在您关心的语言上亲自重新运行该脚本进行验证。 ## ✨ 您将获得的功能
### 🔎 `explore` —— 一次调用,而非四次 匹配度最高的符号的原始源码 + 调用者/被调用者 + 多跳影响范围。Agent 实际需要的结构形式,而不是将 `sym → file → callers → Read` 串联起来。 ### 🧠 排名全文搜索 内存级 SQLite FTS5(支持 bm25、前缀、多词搜索)—— 不是简单的子字符串扫描 —— 并且排除文档字符串节点,因此真正的符号不会被冗长的文本淹没。
### 💥 多跳影响分析 在调用图上进行有深度限制的双向 BFS —— 体现变更的*实际*影响范围,而不是单跳的调用者/被调用者猜测。 ### 🧪 从 diff 获取测试影响 `git diff --name-only \| graphscout affected --stdin` —— 通过解析的导入追踪此次更改会影响哪些测试。
### 🙈 感知 `.gitignore` 的索引 通过 `git ls-files --exclude-standard` 进行路由 —— 完全按照 git 所见的方式处理嵌套的 `.gitignore` 和全局排除文件。硬编码的跳过项(`node_modules`、`dist` 等)始终适用。 ### ⚡ 基于 mtime 的增量缓存 每个代码库只需执行一次 `build`;每次查询仅重新提取更改过的内容。无需数据库服务器,无需守护进程 —— `graphscout watch` 是可选的。
### ⚙️ `exclude` / `include` / `extensions` 可选的 `graphscout.json` —— 强制重新包含 vendored 路径,丢弃冗余的生成代码,或将非标准后缀映射到支持的语言。 ### 🔌 CLI *与* MCP 两种方式均可执行相同的查询 —— 从任何 Agent 执行 shell 命令,或者使用一条命令将 MCP 服务器接入 Claude Code、Codex、Gemini CLI、Cursor 和 Windsurf。
### 🔬 符号级 `diff` `graphscout diff HEAD~5` —— 新增/移除/修改的**函数**,而不是代码行块。重命名显示为一个更改的符号。 ### 🧹 死代码 `orphans` 在排除入口点/测试/带装饰器的处理器*并*进行文本交叉检查以寻找图遗漏的调用方式后,代码库中没有调用者的代码。
### 🔥 `hotspots` —— 变更频率 x 连通性 频繁更改且处于结构中心的文件 —— 重构优先级,而不仅是代码行数的猜测。 ### 🌐 `routes` —— 一次调用获取 API 表面 Flask/FastAPI/Django/Express/Gin/NestJS/Spring/ASP.NET/Actix/Rails/Laravel 路由检测,在索引的文件集上使用正则表达式。
### 🩺 `doctor` + 后台 `daemon` 一条命令排查“为什么 X 回退了”,外加分离的 `daemon start`,确保无需前台终端也能保持图形最新。 ### 📦 全局支持 `--json` 每个查询命令均支持用于脚本/CI 的 `--json`;面向 Agent 的默认设置依然是纯文本。
### 📊 `metrics` —— 来自图的复杂度 Fan-in(核心承载节点)、fan-out(复杂度代理指标)、引用耦合度、函数体行数 —— 可针对单个符号或对整个代码库排名。提供单凭调用列表无法给出的信号。 ### 🔗 `why` + `recent` + `tokens` `why a b` —— 从 A→B 的最短调用链。`recent` —— 最近 N 次提交触及的符号。`tokens name` —— 阅读前的函数体成本。 ### 🗺️ `viz --kind=imports` 调用图可视化(Mermaid/DOT)现在还可以渲染**模块依赖图** —— 即 `cycles`/`affected`/`rdeps` 推理所用的结构图,并将其绘制出来。
## 🧭 命令 | 命令 | 解决的问题 | |---|---| | `graphscout explore [dir]` | **从这里开始** —— 原始源码 + 调用边 + 影响范围,一次调用 | | `graphscout search [dir]` | 排名全文符号搜索(FTS5,多词,前缀) | | `graphscout impact [dir]` | 更改符号前的多跳影响范围(`--depth`) | | `graphscout affected ` | 受更改文件传递影响的测试文件(`--stdin`,`--depth`) | | `graphscout diff [ref2] [dir]` | 符号级别的新增/移除/修改定义(省略 `ref2` → 工作树) | | `graphscout routes [dir]` | 跨 10 个框架检测 API 路由/endpoint | | `graphscout orphans [dir]` | 死代码候选 —— 代码库中没有调用者(`--limit`) | | `graphscout hotspots [dir]` | 重构优先级:变更频率 x 连通性(`--commits`,`--limit`) | | `graphscout metrics [query] [dir]` | 单个符号的 fan-in/fan-out/refs/行数,或代码库排名(`--limit`) | | `graphscout dupes [dir]` | 跨文件的复制粘贴/高度相似的函数体(`--min-lines`) | | `graphscout recent [dir]` | 最近 N 次提交触及的文件中的符号(`--commits`) | | `graphscout why
[dir]` | 从符号 a 到符号 b 的最短调用链 | | `graphscout tokens [dir]` | 单个符号函数体的 token 成本(tiktoken 或 chars/4) | | `graphscout viz [name] [dir]` | 将调用图 / 影响范围渲染为 Mermaid 或 DOT(`--kind=imports`,`--format=dot`) | | `graphscout map [dir]` | 代码库概览:大小、按目录细分、核心中心符号 | | `graphscout file ` | 单个文件的大纲:定义 + 行范围 | | `graphscout sym ` | 此符号在哪里定义?(纯子字符串匹配) | | `graphscout callers ` / `callees ` | 谁调用了它 / 它调用了什么(单跳) | | `graphscout deps ` | 这个文件导入了什么? | | `graphscout build [dir]` / `ensure [dir]` | 完整构建(每个代码库一次) / 增量刷新(自动) | | `graphscout watch [dir]` | 阻塞进程,随着文件更改保持图同步 | | `graphscout daemon start\|stop\|status [dir]` | 同 `watch`,但在后台分离运行 | | `graphscout roots` | graphscout 曾经索引过的每个代码库及其大小和新鲜度 | | `graphscout doctor [dir]` | 环境检查:FTS5、git、mcp/watchdog 扩展、缓存健康状况 | | `graphscout touch ` | 重新提取单个文件(用于编辑器/Agent 钩子) | | `graphscout agent` | 打印适用于您 Agent 上下文文件的指令片段 | | `graphscout install [agent...]` / `uninstall` | 为检测到的 Agent 接入(或移除)MCP 服务器 | | `graphscout mcp` | 作为 MCP 服务器运行(stdio) | 为任何查询命令(`map`、`sym`、`search`、`callers`、`callees`、`impact`、`deps`、`routes`、`orphans`、`hotspots`、`metrics`、`dupes`、`recent`、`why`、`tokens`、`viz`、`affected`、`diff`、`doctor`、`roots`)追加 `--json`,即可获取结构化输出而非格式化文本。 ## 🏗️ 工作原理
build → tree-sitter extraction → graph.json cache → query, with data flowing through the pipeline
📐 以 Mermaid 图表展示的相同 pipeline(点击展开)
``` flowchart LR A["build / ensure"] -->|"git ls-files --exclude-standard
(honors .gitignore)"| B["tree-sitter extraction
via graphify"] B --> C[("graph.json
+ mtime index
~/.cache/graphscout")] C --> D{"query"} D -->|explore| E["verbatim source
+ call edges
+ blast radius"] D -->|search| F["FTS5 ranked
symbol search"] D -->|impact / affected| G["multi-hop BFS
over call / import edges"] style E fill:#7ee7c7,color:#0d1117 style F fill:#a5b4fc,color:#0d1117 style G fill:#a5b4fc,color:#0d1117 ```
每次查询都会先调用 `ensure` —— mtime 发生变化的文件将被重新提取并拼接到图中;已删除的文件将被剔除。典型的刷新只触及少数几个文件,因此查询速度很快。输出特意为带有 `file:line` 位置的纯文本 —— 在大多数 Agent UI 中可点击,对其他部分也极易解析。设置 `GRAPHSCOUT_CACHE` 可更改缓存位置(在 CI 和沙盒中非常有用)。 ## 🤖 与任何 Agent 集成 `graphscout` 是纯粹的标准输出 CLI,因此**任何能够运行 shell 命令的 Agent 都可以使用它** —— Claude Code、Codex CLI、Cursor、Aider、OpenHands、Goose 或自定义 Agent。 **1. 告诉 Agent 图形已存在:** ``` graphscout agent >> AGENTS.md # or CLAUDE.md, .cursorrules, .github/copilot-instructions.md ``` **2. (可选)保持图在每次编辑时都是最新的。** 对于 Claude Code,安装内置的 PostToolUse 钩子,以便每次 `Edit`/`Write` 仅重新提取该特定文件: ``` cp integrations/claude-code/graphscout-touch.sh ~/.claude/hooks/ chmod +x ~/.claude/hooks/graphscout-touch.sh # 然后将 integrations/claude-code/settings-snippet.json 合并到 ~/.claude/settings.json ``` 即使没有钩子,查询也能保持正确 —— 每次查询都会先运行 mtime 检查,并重新提取任何过时的内容。 ### 🔌 MCP,自动接入 ``` pip install "graphscout[mcp]" graphscout install # auto-detects and wires every agent found on PATH graphscout install cursor # or target specific agents: claude-code, codex, gemini, cursor, windsurf graphscout uninstall # reverse it ``` 如果各个 Agent 本身存在 `mcp add` 命令,`install` 会直接调用各 Agent 的命令(Claude Code、Codex CLI、Gemini CLI —— 经过其真实 CLI 验证,而非猜测),并直接编辑 `~/.cursor/mcp.json` / `~/.codeium/windsurf/mcp_config.json` 以适用于 Cursor/Windsurf。该操作是幂等的 —— 可安全重复运行。 提供的工具:`explore`(首选使用)、`search`、`impact`、`affected`、`symbol_diff`、`routes`、`orphans`、`hotspots`、`list_roots`、`doctor`、`build_graph`、`graph_map`、`file_outline`、`find_symbol`、`callers`、`callees`、`file_deps`。服务器的 `instructions` 会引导 Agent 首选 `explore` —— 一个强大的工具胜过一堆狭隘的菜单。 ### 🔄 自动同步(可选) ``` graphscout watch # blocks, keeps the graph in sync as you/your agent edit files graphscout daemon start # same loop, detached — survives closing the terminal graphscout daemon status # is it running? pid + log location graphscout daemon stop # stop it ``` 安装后使用 [watchdog](https://pypi.org/project/watchdog/) 获取即时的、低 CPU 消耗的文件系统事件;否则回退到约 1.5 秒的 mtime 轮询。`daemon` 将相同的循环包装在带有 pidfile 的分离子进程中(纯 Python —— 无需捆绑运行时,无需 OS 服务管理器集成)。一次只运行一种同步机制 —— `watch`、`daemon` 或每次编辑触发的 `touch` 钩子,不要同时使用多个。 ## 🙈 排除、包含、自定义扩展名 默认情况下零配置。硬编码的跳过项(`.git`、`node_modules`、`venv`/`.venv`、`dist`、`build`、`target`、`vendor` 等)始终适用,无视 `.gitignore`。在 git 代码库中,也会通过 `git ls-files --exclude-standard` 遵循 `.gitignore` —— 包括嵌套的 `.gitignore` 和全局排除文件,与 git 本身看到的一致。 若需进一步配置,请在代码库根目录下放置一个 `graphscout.json`: ``` { "exclude": ["static/", "**/generated/**"], "include": ["third_party/vendored_dep/"], "extensions": {".tpl": "php"} } ``` `exclude` 优先于一切,包括 `include`;`include` 可以将 `.gitignore` 排除的路径重新拉回,但无法覆盖硬性跳过列表。`extensions` 可将非标准后缀映射到 graphify 已经能够解析的语言。 ## 📊 基准测试 `python scripts/benchmark.py ` 比较了旧的 `sym`+`file`+`callers`+`callees` 工作流(4 次调用,没有原始源码 —— 后面仍需执行一次 `Read`)与 `explore`(1 次调用,包含源码)的区别,基于从目标代码库自身调用图中挑选的真实符号进行测试。**这不是真实的 Agent 实验** —— 这是一个任何人都可以重现的、离线的代理测试: | 代码库 | 旧调用次数 → 新调用次数 | 旧 payload → 新 payload | |---|---|---| | 本代码库 (235 个节点) | 20 → 5(**减少 75%**) | 13,954 → 13,137 字符 | | [pallets/click](https://github.com/pallets/click) (1,803 个节点) | 20 → 5(**减少 75%**) | 48,813 → 10,205 字符 | 调用次数的节省是结构性的(无论代码库大小,4 次调用都缩减为 1 次);payload 的节省则因旧路径原始列表的冗长度与一段聚焦代码片段的对比而异。
⚠️ 诚实的局限性(在适用时同样会打印在输出中)
- **未捕获动态分派** —— 调用边来自于静态 AST 分析;`getattr` 风格的调用需要借助 grep。 - **限定模块调用在图中可能不可见** —— `from mod import fn; fn()` 可以解析;同样常见的 `import mod; mod.fn()` 惯用法仅在模块上产生 `imports` 边,而不是在函数上产生 `calls` 边(这是 graphify 的局限性,而非 graphscout 的)。正是由于这个原因,`orphans` 会进行纯文本交叉检查;而 `callers`/`callees`/`impact` 没有这样做,因此对于以这种风格编写的代码库,它们统计的数值可能会偏低。 - **不受支持/特殊的语言**会回退到“直接阅读”。 - **`affected` 在多名称绝对导入上检测不足** —— `from pkg import a, b` 解析为包上的一条边,而不是按名称区分。相对导入和单名称绝对导入可以完全解析。 - **没有来自提取器的行范围** —— graphify 为每个符号记录起始行,而不是起始+结束行;`explore` 的代码片段结尾被推断为“同一文件中下一个符号之前的那一行”(上限为 60 行)。 - **`routes` 是一种正则表达式启发式方法**,而不是语义方法 —— 它可能匹配到注释或文档字符串中呈路由状的字符串,并且会漏掉通过数据驱动表或运行时计算的装饰器注册的路由。 - **`orphans`/`hotspots` 是启发式方法,而非绝对确定** —— 在删除“死”代码之前请进行验证(动态分派、反射和已发布库的外部调用者在静态图中看起来都是未被引用的),也不要过度关注仅仅因为无聊的原因(如配置文件、更新日志)而频繁变动的“热点”文件。 - **限制:** 每个代码库最多 5,000 个文件,每个文件 1 MB(会发出警告,而非静默处理);影响范围/impact 遍历在达到 400 个节点时停止(标记为 `(truncated)`)。
## ⚖️ 客观对比 vs. colbymchenry/codegraph [colbymchenry/codegraph](https://github.com/colbymchenry/codegraph) 是一款资金充足、积极开发的产品 —— 拥有 59k+ 的 Star,带有捆绑运行时的 Node/TypeScript 代码库,测量了每种语言的跨文件覆盖率,并拥有真实发布的 Agent 基准测试。`graphscout` 则是一个小型的、单一用途的 Python 工具。截至本次对比(0.6.0 版本,已对照 codegraph 自己的 README 进行检查): | | graphscout | colbymchenry/codegraph | ||:---:|:---:| | 原始源码 + 调用边 + 影响范围,一次调用 | ✅ `explore` | ✅ `codegraph_explore` | | 排名全文搜索(FTS5) | ✅ | ✅ | | 多跳影响 / 影响范围 | ✅ | ✅ | | 从 diff 获取测试影响 | ✅ `affected` | ✅ `affected` | | 感知 `.gitignore` 的索引 | ✅ | ✅ | | 框架路由检测 | ✅ 10 个框架 | ✅ **17 个框架** | | 原生 OS 文件监视守护进程 | ✅ `daemon start/stop/status` | ✅ 内置 | | JSON 输出 | ✅ 每次查询均支持 `--json` | ✅ | | **符号级别的 git diff**(新增/移除/修改的是*定义*,而非代码行) | ✅ `diff` | 不在 codegraph 发布的工具列表中 | | **死代码检测**(`orphans`) | ✅ | 不在 codegraph 发布的工具列表中 | | **变动频率 x 连通性热点**(`hotspots`) | ✅ | 不在 codegraph 发布的工具列表中 | | **复杂度指标** —— 每个符号的 fan-in/fan-out/refs/行数(`metrics`) | ✅ | 不在 codegraph 发布的工具列表中 | | **重复函数体检测** —— 跨文件复制粘贴(`dupes`) | ✅ | 不在 codegraph 发布的工具列表中 | | **近期更改追踪** —— 最近 N 次提交触及的符号(`recent`) | ✅ | 不在 codegraph 发布的工具列表中 | | **最短调用路径** A→B(`why`) | ✅ | 不在 codegraph 发布的工具列表中 | | **Token 成本估算** 每个符号(`tokens`) | ✅ | 不在 codegraph 发布的工具列表中 | | **模块依赖可视化**(`viz --kind=imports`) | ✅ | 不在 codegraph 发布的工具列表中 | | 具有完整定义/调用/导入提取的语言 | 16/20 采样,可复现(`scripts/lang_coverage.py`) | **31 种**,依据 codegraph 文档 | | 跨语言桥接(Swift↔ObjC、React Native、Expo) | ❌ | ✅ | | 可索引的扩展名(包括仅支持大纲的) | 92 种,直接从 graphify 获取 | 未公布 | | 运行时 | 纯 Python(无捆绑运行时) | 捆绑 Node.js 运行时 | | 遥测 | **绝对没有** | 可选择关闭,匿名化 | | 已发布的 Agent 基准测试 | 离线调用/payload 代理(见下文) | 跨 7 个代码库的真实 Claude-Code 实验 | | 许可证 | MIT | MIT | graphscout 仍然落后的地方在于:原始语言数量(codegraph 自己的提取器端到端覆盖了 更多语言)和跨语言桥接(Swift↔ObjC、React Native、 Expo)—— 这两者都是真实存在、尚未填补的差距,并非为了效果而故意保留。现在它领先的领域在于: **九种查询类型**(`diff`、`orphans`、`hotspots`、`metrics`、`dupes`、`recent`、 `why`、`tokens`、`viz --kind=imports`)均不在 codegraph 发布的工具 列表中,它们以极其精简的代码体量实现,且具有零遥测和无捆绑运行时的特点。 如果您需要 31 种语言覆盖或跨语言桥接,请使用 codegraph。如果您 想要一个小巧、可审计、无遥测的工具,同时还能回答“实际更改了 什么”、“什么是死代码”、“我应该首先重构什么”、“这有多复杂”、 “复制粘贴在哪里”,以及“是否值得阅读整个函数” —— 这正是 `graphscout` 所增加的价值。 ## 📈 Star 历史
**如果 `graphscout` 为您的 Agent 节省了数千个 token,请点个 ⭐ —— 这是它唯一的营销预算。**
点赞   pip install   问题反馈

MIT © Duc Nguyen · 解析由 graphify(基于 tree-sitter)提供 · 为 Agent 而生,为人类审计
Star History Chart
标签:AI编程助手, MCP协议, SOC Prime, 上下文缓存, 代码图谱, 代码导航, 开发工具, 逆向工具