seek://map/graphlint
graphlint 死代码检测
#static-analysis #dead-code #dependency-graph #code-quality #cli
TL;DR
据其 README,graphlint 是面向 AI 生成代码库的死代码检测工具:构建依赖图、识别入口点,把从任何入口点均不可达的组件报为死代码,让 agent 自行清理、保持代码库简洁。Python 分析内置(标准库 ast),Rust、C#、C/C++ 与 TypeScript/JavaScript 经 tree-sitter 可选依赖启用。仓库 integrations/dsh 随附 DSH bundle——graphlint_query / graphlint_build / graphlint_config 工具与 graphlint skill,硬性拒绝会话工作目录之外的扫描根;npm 包 dsh-graphlint 与 PyPI 包 graphlint 均已发布,由 AngelosZou 维护。
AI agent 在快速生成代码的同时,也会留下冗余和死代码,graphlint 正是冲着这些残留物来的:构建依赖图、找到入口点,把从任何入口点均不可达的组件判为死代码。Python 分析内置,Rust、C#、C/C++ 与 TypeScript/JavaScript 经 tree-sitter 可选依赖接入,告警从循环引用覆盖到只写变量。integrations/dsh 下的 DSH bundle 把分析器接成 graphlint_query / graphlint_build / graphlint_config,并以硬性护栏拒绝会话工作目录之外的扫描根。
速览
- install
- dsh plugin --profile web add dsh-graphlint
- license
- MIT
- note
- bundle 需 graphlint CLI 在 PATH(pip install graphlint);纯静态分析,getattr、importlib 等动态引用可能误报,按项目惯例配置 entry_rules。
要点
- 据其 README,死代码的定义是从所有入口点均不可达的组件:graphlint 把代码库建成有向依赖图(边为 read、write、call、inherit、decorate),识别入口点后做可达性分析;动机是 AI agent 留下的冗余与死代码会污染 LLM 上下文窗口、稀释注意力,清理交给 agent 自己完成
- 入口点检测内置主流框架规则——Python 侧覆盖 FastAPI、Flask、Django、Click、Typer、Celery、pytest,其余后端各有约定(main、测试框架、Next.js pages、NestJS 装饰器等)——自定义规则用 ast_pattern 前缀(function_def:、decorator:、export: 等)添加;--public-as-entry 可把 Rust pub、C# public 与 C 外部链接符号视为入口,用于库分析模式
- DSH 集成随仓库 integrations/dsh 发布:graphlint_query(依赖图查询、结构化 JSON 结果)、graphlint_build(后台任务式索引构建,用 job_output 轮询)、graphlint_config(读写 .graphlint/config.json),并随附 graphlint skill 教 agent 何时用、怎么用;工具默认限定会话工作目录,硬性拒绝目录之外的扫描根——README 说明这是为防误扫高层目录导致长时间阻塞
- 所有 agent 渠道派生自随包发布的同一份规范 skill 文档(graphlint/skill.md),互不漂移:~/.agents/skills 的 skill 文件、--targets all 装到 ~/.claude/skills、install prompt 注入 opencode、cursor、codex、cc 的配置,以及 DSH 插件
- 语言支持:Python 内置(标准库 ast);Rust、C#、C/C++(按含入它的翻译单元路由 .h 的统一分析器)与 TypeScript/JavaScript(JSX、Next.js pages、NestJS 装饰器、Jest/Vitest 测试、import/export 分析)经 pip 可选依赖(graphlint[rust] / [csharp] / [c] / [typescript])启用 tree-sitter 后端
- 据其 README,告警共 11 种类型,dead_code 之外还有 circular_ref、unused_import、write_only、deprecated_usage、type_mismatch、unresolved_ref 等;首次全量扫描后仅对变更文件增量重建;CLI 的 --fail-on 在匹配到指定告警时以退出码 2 供 CI 拦截
- README 局限性一节写明:纯静态分析识别不了 getattr、importlib 等运行时动态链接(主要影响 Python),需按项目约定加自定义入口规则——graphlint 自身代码库就用 function_def:_detect_* 与 function_def:visit_* 防止经 getattr 发现的函数被误报;npm 包 dsh-graphlint 已发布——本站 2026-09-17 探测 registry,latest 读到 0.4.0、发布时间 2026-09-16;PyPI 包 graphlint 同日探测读到 0.7.1(要求 Python ≥ 3.9)
常见问题
它和普通 lint 有什么不同?
unused_import、unused_variable 这类告警查单个名字有没有被用到;dead_code 查的是结构——README 把死代码定义为从所有入口点均不可达的组件,靠整图可达性分析得出。前者管浪费的名字,后者管断链的结构,两者列在同一张告警表里。
静态分析会不会误报?
会,README 在局限性一节写明:getattr、importlib、元类等运行时动态链接无法检测,可能产生假阳性,主要影响 Python;缓解办法是按项目约定调整 entry_rules 配置——graphlint 自身代码库就用了 function_def:_detect_* 与 function_def:visit_* 这样的 ast_pattern,防止经 getattr 发现的函数被误报。Rust 宏展开、C# 反射、C++ 虚分发也有类似告示。
在 DSH 里怎么装?
按 README,可以 npm 直装:dsh plugin --profile web add dsh-graphlint;也可以先装好 CLI 再用 graphlint install dsh --profile web。bundle 需要 graphlint CLI 在 PATH 上(pip install graphlint),装完重启 dsh web。
除了 Python 还要装什么?
Python 分析用标准库 ast,无需额外依赖;Rust、C#、C/C++ 与 TypeScript/JavaScript 都是可选依赖:pip install graphlint[rust] / [csharp] / [c] / [typescript],各自引入对应的 tree-sitter 语法包。
官方参考