问题
每个项目本来就自带一个会告诉你哪里不对的工具 —— tsc、dart analyze、ESLint、
Clippy、go vet、Ruff。但没有一个会告诉你:刚打印出来的那四十条警告,是不是
你这次的改动带来的。Gitcito 知道哪些文件是脏的,所以同一份列表用一个开关就能
回答这个问题。

状态栏带着计数 —— 错误、警告、提示,就是 VS Code 教会所有人去读的那三个数字。 点它(或者在命令面板里选 问题),面板就在底部打开,按文件分组。点某一行, 文件会直接定位到那里。 在第一次扫描之前,它显示的是短横线而不是零:还没有人看过,而三个零会声称相反的事。
它会运行什么
| 仓库里有 | Gitcito 就运行 |
|---|---|
pubspec.yaml |
dart analyze --format=machine |
tsconfig.json |
tsc --noEmit |
| ESLint 配置 | eslint -f json |
Cargo.toml |
cargo clippy --message-format=short |
go.mod |
go vet ./... |
pyproject.toml 或 ruff.toml |
ruff check --output-format=json |
Flutter 走的是 Dart 那一行: Flutter 应用就是 Dart 项目,flutter analyze
调用的也正是 dart analyze 用的那个分析器。
项目不必在仓库根目录。 这些标记文件也会往下找几层,所以 mobile/ 下的 Flutter
应用、apps/web 下的包都会被找到,每个分析器都在自己项目的目录里运行。如果祖先目录
已经覆盖了同类型的嵌套项目,就跳过 —— 根目录的 tsconfig.json 说的正是这个 ——
并且一次扫描最多十二个项目,毕竟 monorepo 不该拉起五十个编译器。
设置 → 通用 → 代码分析器决定它有多主动:打开面板时扫描(默认)、只在你点刷新时, 或者关闭 —— 关闭会把面板的分析器那一半、状态栏计数器和命令一起藏起来。
node_modules/.bin 里的可执行文件优先于 PATH 上的那个 —— 项目自己的脚本也是这么
解析的。所有工具并行运行,输出统一成一种形状、去重并排序:两个分析器报同一行,
只会得到一行。
不会自己运行。 大仓库上跑 tsc --noEmit 是几十秒的事,而且这些命令属于仓库
自己的工具链,不属于 Gitcito。它们在你打开面板或者按刷新时才开始,绝不自作主张。
这也是列表只是一张快照的原因:改了文件之后,在你重新运行之前它就过期了。
构建产物会被丢掉。 一个指向项目根目录的工具会检查它找到的一切,而它找到的东西
里包括 .next/build/chunks、打包出来的 dist、vendor 进来的副本 —— 几百条关于机器
写出来的代码的抱怨,会把关于你代码的那几条埋掉。Gitcito 会问 git 哪些文件被忽略,
把这些丢掉;但绝不丢掉已跟踪的文件:把构建产物提交进仓库是一个选择,
git check-ignore 尊重这个选择。node_modules 无论如何都不进来。
只看你改过的
标题栏里的开关会丢掉所有你没碰过的文件里的问题。这才是值得一直开着的视图:一份 把代码库里所有警告拉平的清单,一周之内就变成了墙纸;而"这些是不是这次改动加进来 的",是提交之前值得回答的问题。
严重程度的小胶囊也会过滤。不亮表示全部显示;点亮其中一个就只看那一类。
限制
- 没有语言服务器。 这是一次扫描,不是常驻进程:打字时不会有波浪线,你不问 就不会有结果。
- 没装的工具会被点名,而不是藏起来。 页脚会说哪个没跑成,因为一份没有解释的 空列表,比一份有理由的短列表更糟。
- 只认识机器可读的输出。 每个分析器都按它自己文档化的机器格式解析;被配置成 输出别的东西的工具,在这里是隐形的。
- 上限是五千条问题。 超过之后面板会说明并停下 —— 到那个地步的仓库,麻烦比 滚动条大多了。