🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI
广告☁️ 云服务器特惠阿里云首购 8 折 · 腾讯云合作特惠
DeepSeek Harness Hub
← 返回列表

AngelosZou/graphlint

DeepSeek Harnessspec-screened扫描:低风险在 GitHub 查看 ↗
需源码安装

面向 AI 生成代码库的死代码检测。

暂不能直接安装(需源码编译或环境不满足):仓库缺少 package.json,无法用 dsh 插件安装命令安装。 · 最近上游提交 2026/9/16 · 已提供中文文档

针对AI生成代码库的死代码检测:graphlint构建依赖图,找出从任何入口点都无法到达的代码,从而实现代码库清理和功能有效性理解。

综合分
38.2
GitHub 分
38.2
用户评分
—
★ Stars
7
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add AngelosZou/graphlint
仓库缺少 package.json,无法用 dsh 插件安装命令安装,改用 GitHub 源安装
信任档位:已验证本站已于 4 天前真实安装成功(L4 · 真实安装)
是什么
dsh 原生插件 · tool
装得上吗
本站已真实安装成功(L4 · 真实安装,非静态推断)
安全吗
本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
还在维护吗
活跃:最近一次提交在 9 天前

档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →

🟢实装验证通过· 2026/9/21
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/20(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查需源码安装

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包graphlint(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

仓库缺少 package.json,无法用 dsh 插件安装命令安装

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/20 06:30:30

用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

由 DeepSeek 最新模型翻译生成
graphlint

PyPI
Python
License

面向 AI 生成代码库的死代码检测。

AI 智能体会快速生成代码,留下死代码和冗余代码,污染 LLM 的上下文窗口并稀释注意力。Graphlint 分析代码库的依赖图,识别入口点并检测死代码——即从任何入口点都无法到达的组件——以便智能体能够自我清理并保持代码库精简。

支持的语言

| 语言 | 状态 | 解析器 | 特性 |
|----------|--------|--------|----------|
| Python(.py) | 内置 | ast(标准库) | 装饰器、类型注解、动态导入、框架感知的入口检测 |
| Rust(.rs) | 内置(可选依赖) | tree-sitter | 属性宏、trait、pub 可见性、macro_rules! |
| C#(.cs) | 内置(可选依赖) | tree-sitter | 分部类、属性/索引器/事件、特性、.csproj 感知、测试框架入口 |
| C / C++(.c .h .cpp .cc .cxx .hpp .hh .hxx) | 内置(可选依赖) | tree-sitter | struct/union/enum 成员、typedef、宏、#include 跟踪、按 TU 的 static 链接、C 库入口模式、C++ 类/命名空间/模板、跨 TU 成员调用解析 |
| TypeScript / JavaScript(.ts .tsx .js .jsx .mts .cts .mjs .cjs) | 内置(可选依赖) | tree-sitter | JSX/React 组件、Next.js 页面、NestJS 装饰器、Jest/Vitest 测试、导入/导出分析 |

安装可选语言支持:

pip install graphlint[rust]        # adds tree-sitter and tree-sitter-rust
pip install graphlint[csharp]      # adds tree-sitter and tree-sitter-c-sharp
pip install graphlint[c]           # adds tree-sitter + tree-sitter-c + tree-sitter-cpp (C/C++)
pip install graphlint[typescript]  # adds tree-sitter + tree-sitter-typescript + tree-sitter-javascript

C/C++ 由单一统一的 C/C++ 分析器进行分析,该分析器负责 .c .h .cpp
.cc .cxx .hpp .hh .hxx。它对 C 文件使用 tree-sitter-c,对 C++ 文件使用 tree-sitter-cpp,
并根据包含该 .h 的翻译单元(TU)的语言来路由 .h
—— 与 C/C++ 编译器的做法完全一致。额外的一个 graphlint[c] 会同时安装
这两个语法。

特性

- 死代码检测 —— 通过图遍历找出从任何入口点都无法到达的组件
- 多语言支持 —— 通过语言适配器抽象支持 Python、Rust、C#、C/C++(统一)、TypeScript 和 JavaScript 后端;Python 使用标准库 ast,其他使用 tree-sitter
- 语言特定感知 — Python 装饰器、Rust 属性宏(#[tokio::main]、#[test])、C# 特性([Fact]、[HttpGet])、C 翻译单元作用域(static 内部链接、每个 TU 头文件中的 static)和库入口模式、C++ 类/命名空间/模板、enum class 成员以及跨 TU 成员调用解析、TS/JS JSX 元素和 ES 模块导入/导出、trait 实现、pub/public 可见性、分部类等
- AST/CST 解析 — 提取函数、方法、结构体、枚举、trait、impl、宏、类、属性、索引器、事件、变量和字段;感知类型注解、解构变量和泛型
- 依赖图 — 构建有向边:read、write、call、inherit、decorate
- 入口点检测 — 内置规则覆盖 Python 框架(FastAPI、Flask、Django、Click、Typer、Celery、pytest)、Rust 约定(main、异步运行时、WASM、过程宏、FFI、测试、pub API)、.NET 约定(控制台、xUnit、NUnit、MSTest、Web API、Minimal API、Generic Host、WinForms、WPF)、C/C++ 约定(C 的 main/WinMain/wWinMain/DllMain/_tmain 和 C++ 的自由 main、class_definition: 模式、按约定的 test_file,以及通过外部链接符号的 C 库模式)和 TS/JS 约定(main、模块索引、CLI/服务器监听、Next.js 页面、NestJS 装饰器、React JSX、Jest/Vitest 测试)以及自定义规则
- 可配置入口模板 — 通过 ast_pattern 前缀添加自定义入口规则,包括 function_call:、function_def:、decorator:、class_definition:(C#)、file_match:、file_is_program(C#)、visibility:pub(Rust)、visibility:public(C#)、trait_impl:(Rust)、macro_def:(Rust)、jsx_element:(TypeScript)、export:(TypeScript)等
- --public-as-entry 标志 — 将所有公共项(Rust pub、C# public、C 外部链接符号)视为入口点以进行库分析
- 警告检测 — 11 种警告类型,包括循环引用、未使用的导入、只写变量等
- 增量更新 — 初始全量扫描后,仅重新索引已更改的文件;增量感知的可达性分析避免全图重新计算;不兼容的索引模式版本会被自动检测并重建
- Python API + CLI — 集成到任何 Tool、CI 流水线中,或让代理自我分析和自我清理

安装

pip install graphlint

要求: Python >= 3.9

对于 Rust 支持(.rs 文件),安装可选的 tree-sitter 依赖:

pip install graphlint[rust]

对于 C# 支持(.cs 文件),安装可选的 tree-sitter 依赖:

pip install graphlint[csharp]

对于 C/C++ 支持(.c .h .cpp .cc .cxx .hpp .hh .hxx 文件),安装可选的 tree-sitter 依赖(一个额外项同时覆盖两种语法):

pip install graphlint[c]   # adds tree-sitter + tree-sitter-c + tree-sitter-cpp (C/C++)
对于 TypeScript/JavaScript 支持(.ts .tsx .js .jsx .mts .cts .mjs .cjs 文件),请安装可选的 tree-sitter 依赖:

pip install graphlint[typescript]

快速开始

智能体集成

Graphlint 会在全局级别将其使用指南安装到你的 AI 编码工具中:

安装 graphlint 技能(~/.agents/skills/graphlint/SKILL.md)——默认,推荐
graphlint install
graphlint install --targets all      # 同时安装到 ~/.claude/skills/graphlint/SKILL.md

安装 DeepSeek Harness 插件(在 DSH 中推荐——基于工具的集成)
graphlint install dsh --profile web

将提示词注入到智能体配置文件中(opencode、cursor、codex、cc)
graphlint install prompt

将提示词复制到剪贴板,以便手动粘贴到你的智能体中
graphlint prompt

移除已安装的技能 / 提示词
graphlint uninstall

所有渠道都源自包中随附的同一份规范技能文档(graphlint/skill.md),因此技能文件、注入的提示词以及 DeepSeek Harness 插件的 graphlint 技能永远不会出现偏差。有关详细信息,请参阅 智能体集成。如果你希望某些工具获得原生支持,欢迎提交 issue——这些请求通常会很快得到处理。

DeepSeek Harness 插件

本仓库的 integrations/dsh 下随附了一个用于 DeepSeek Harness 插件生态系统的插件包:

- 工具 —— graphlint_query(带结构化结果的依赖图查询)、graphlint_build(作为后台任务构建索引,通过 job_output 轮询)、graphlint_config(对 .graphlint/config.json 执行 show/get/set)。
- 技能 —— 一个 graphlint 技能,教会智能体何时以及如何使用这些工具。
- 安全性 —— 工具默认以会话工作目录为根,并硬性拒绝该目录之外的任何根路径,因此意外的高层级扫描不会阻塞一轮对话。

从 npm 安装该插件包:

dsh plugin --profile web add dsh-graphlint

然后重启 dsh web。若要改为链接本地检出(用于开发):

1. 克隆仓库并构建插件包(需要 Node.js >= 20)
git clone https://github.com/AngelosZou/graphlint.git
cd graphlint/integrations/dsh
npm install
npm run build

2. 将插件包链接到某个 profile 中(从仓库根目录运行)
cd ..
dsh plugin --profile web add link:./integrations/dsh

3. 重启 dsh web

CLI

查找当前目录中的死代码
graphlint query --warn-types "dead_code"

完整分析并输出 JSON
graphlint query --json

查看特定图的详细信息
graphlint query -g 1 --detail full

当发现死代码或循环引用时以非零状态退出(用于 CI)
graphlint query --json --fail-on dead_code,circular_ref

将所有公共项视为入口点(库分析模式)
graphlint query --public-as-entry

重建索引
graphlint build --force
配置
graphlint config show
graphlint config set --key lang --value en

退出码

| 代码 | 含义 |
|------|---------|
| 0 | 成功 — 没有警告匹配 --fail-on |
| 1 | 错误 — 参数无效、异常或配置错误 |
| 2 | 发现警告 — --fail-on 匹配到指定的警告类型 |

将 --fail-on 与以逗号分隔的警告类型列表一起使用,可使 graphlint query 在发现匹配的警告时返回退出码 2。这样就能集成到 CI 流水线中,而不会因非关键警告而阻塞。

Graphlint 基于静态分析,无法识别某些 Python 动态引用(例如 getattr、importlib),这可能会产生意外的退出码。只有在您对自己的配置有信心时,才使用 --fail-on 来实现 CI 阻塞行为。对于需要上下文判断的逻辑,智能体(Agent)更为合适。详情请参阅局限性。

Python API
python
from graphlint.api import query

Find dead code components
result = query(warn_types="dead_code", json_output=True)

Full dependency graph analysis
result = query(include_tests=True, json_output=True)

警告类型

| 警告 | 描述 |
|---------|-------------|
| unused_import | 导入的模块或名称从未被使用 |
| dynamic_import | 通过 importlib 或 __import__ 进行的动态导入 |
| circular_ref | 函数/类之间的循环依赖 |
| syntax_error | 文件包含语法错误 |
| write_only | 变量被写入但从未被读取 |
| deprecated_usage | 使用了已弃用的函数/类 |
| dead_code | 组件无法从任何入口点到达 |
| type_mismatch | 可疑的类型注解 |
| unresolved_ref | 对未定义名称的引用 |
| unused_variable | 变量被定义但从未被使用 |
| file_too_large | 文件超过配置的大小限制 |

开发
bash
Clone the repository
git clone https://github.com/AngelosZou/graphlint.git
cd graphlint

Create a virtual environment
python -m venv env
env/Scripts/activate  # Windows
source env/bin/activate  # Unix

Install dev dependencies
pip install -e ".[dev]"

Run tests
pytest

Run with coverage
pytest --cov=graphlint

Run type checking
mypy graphlint/

Run linting
ruff check graphlint/ tests/

配置

Graphlint 将其配置存储在被分析目录中的 .graphlint/config.json 内。使用 graphlint config 命令来管理设置,或直接编辑该文件。

运行 graphlint config show 可查看完整的默认配置。

文档

完整文档可在 docs/ 目录中找到:

- 入门指南
- 智能体集成
- 配置指南
- 入口点检测
- 警告参考
- CLI 用法
- 架构概览
- Python API

局限性

- 仅限静态分析 —— graphlint 执行静态分析,无法检测诸如 getattr、importlib 或动态分派模式之类的运行时链接,这可能导致误报。这主要影响 Python;Rust 的静态分派模型产生的误报较少。缓解措施: 添加与你的代码库约定相匹配的自定义入口规则。例如,graphlint 自身的代码库使用 function_def:_detect_ 和 function_def:visit_ 模式,以防止通过 getattr 发现的函数被标记为死代码。
- Python 动态导入 —— 由于 Python 的动态导入机制(importlib、getattr、元类等),默认入口模板在严重依赖运行时分派的代码库中可能产生误报。用户应调整 entry_rules 配置以匹配其项目的约定。
- Rust 宏展开 —— tree-sitter 解析未展开的源代码;过程宏和 macro_rules! 主体以不透明的 token 树形式出现。某些由宏生成的调用路径可能会被遗漏。#[derive] 属性通过隐式的 inherit 边被部分识别。
- C# 分部类与反射 —— tree-sitter 独立解析每个 .cs 文件;分部类片段通过 part_of 边合并为单个逻辑节点,但仅通过反射(Activator.CreateInstance、DI 容器注册)调用的成员可能会被遗漏,这与 Python 的动态导入局限性类似。
- C/C++ 静态分析限制 —— 成员调用跨翻译单元进行类型感知解析(通过项目范围的类→方法索引),但没有虚函数/重载/动态分派:通过 Base* 指针进行的调用会静态解析为基类的方法,因此仅通过该方式到达的派生类重写可能被报告为死代码。预处理器被视为纯 AST(#if 从不求值,宏不展开);函数指针间接调用目标不被追踪;头文件中的 static 符号是每个翻译单元独立的。纯虚(= 0)接口方法免于死代码检测(由虚表分派)。C 函数参数不被建模为节点,因此与调用方局部变量同名的参数可能按扁平名称解析。
- --public-as-entry 作用范围 —— 此标志适用于具有 public 可见性声明的语言(Rust pub、C# public)。它对 Python 文件没有影响。切换此标志会触发完整重新索引。对于长期库分析,建议通过 graphlint config 启用 rust_pub_api 入口规则以持久化该设置。
- 大型代码库构建时间 —— 在拥有 700+ 个 .py 文件、1,000+ 个类和 14,000+ 个函数的大型代码库上,完整重建大约需要 200 秒(实际性能取决于硬件)。小型项目(约 60 个文件)约 1 秒完成。此成本是一次性的,在初始完整扫描之后,后续查询使用增量更新。

许可证
MIT — 详情请参阅 LICENSE。

链接

- GitHub 仓库
- 问题追踪器
- PyPI 包

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入社群

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

DPharness QQ 群二维码,QQ 扫码进群
QQ 扫码进群
DPharness 飞书群二维码,飞书扫码进群
飞书扫码进群