Communitygithub.com

vibator/vibator

一套质量门禁工具,为 vibe coding 设立护栏。

vibator 是什么?

vibator 是一款面向开发者工作流的质量门禁(quality gate)工具,专门用于为“vibe coding”(直觉驱动开发)设置可执行的护栏。该工具不依赖预设规则,而是通过发现项目中的实际内容(如代码文件、配置、文档)来动态生成配置,确保检查项与项目的真实需求对齐。它支持在任何 CI/CD 环境或本地命令行中运行,默认规则即可生效,但允许通过 JSON 配置文件(vibator.json)进行精细化调整。核心设计原则包括:不削弱门禁规则来让其通过、仅配置偏离默认值的部分、以及通过 `include`/`exclude` 替换而非合并来管理文件范围。vibator 特别强调增量采用——对遗留代码库可使用 `--changed` 或 `--since` 参数只检查修改的部分,避免一次修复过多问题。它还支持扩展共享预设(通过 `extends` 字段),并与 Biome 的配置合并行为保持一致,适合在微前端或多仓库团队中推广标准。每个规则(如 `locale-parity`、`codegen-drift`、`banned-patterns`)都配有详细的文档和默认值,开发者可通过 `npx vibator explain <rule>` 获取实时指导。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add vibator/vibator

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

配置 vibator

参考:npx vibator docs configuration 会打印配置格式, npx vibator docs rules 会打印每条规则及其选项和默认值。 本技能是工作流程;那些文档才是契约。

配置是一项发现任务:正确的配置取决于项目实际包含的内容。先检查,再编写,最后运行。

基本原则

  • 绝不要为了通过而削弱门禁。 关闭规则、放宽其阈值或排除一个文件,只是因为当前不通过,这会隐藏问题而非修复问题。请修复发现的问题,或者让规则保持失败并说明原因。唯一的逐行逃逸是 // vibator-ignore: <reason>,且必须提供原因。
  • 只配置与默认值不同的部分。 每条规则在无任何配置时都会以其默认严重级别运行。一个重申所有默认值的配置会掩盖真正重要的修改行。
  • include 和 exclude 会替换规则的默认值。 它们不会合并。在缩小范围之前,请先复制你仍需要的默认值。
  • 绝不要设置 recommended: false 来让运行通过。 这会禁用配置未明确指出的所有规则,包括那些已通过的规则。该选项存在的目的是为了明确表达一种人工选择,而这种选择应由人来决定。
  • 项目扩展的配置不是你可以编辑的。 预设规定了一个供多个项目共用的标准。请在本地配置差异部分,或者请人类修改预设。绝不要通过编辑 node_modules 下的文件来压制发现的问题;下次安装都会替换它。

步骤

  1. 从一个有效文件开始。 如果不存在 vibator.json,运行 npx vibator init;它会写入 $schema 行,让编辑器能够进行验证。然后运行 npx vibator list 可以查看每条规则及其默认值。在编写自己的规则之前,检查项目是否已扩展了一个预设,或者是否存在可供扩展的预设(package.json 中的 @scope/quality 类型包,或跨兄弟仓库重复的相同配置)。扩展预设优于重写它;参见下面的“在共享预设上构建”。

  2. 先运行一次,无配置: npx vibator --reporter json。这会显示哪些规则通过、哪些失败、以及哪些因缺少选项而崩溃。在诊断之前先查看数量;一条有 400 个发现项的规则需要一个决策,而不是今天修复 400 个问题(参见步骤 6)。

  3. 发现默认关闭的规则需要什么。 每条规则之所以关闭,是因为它无法在没有项目知识的情况下运行。查找它们:

    • locale-parity:找到语言环境目录(locales/、i18n/、public/locales/)。注意布局:每个语言环境一个目录(layout: "directory-per-locale")还是每个语言环境一个文件("file-per-locale"),以及哪个语言环境是源语言。
    • codegen-drift:读取 package.json 中的脚本以查找生成器(db:generate、openapi、graphql-codegen),并找到每个生成器写入的路径。为每个生成器配置一个条目,包含 name、command、paths。
    • banned-patterns:阅读项目的审查约定(CONTRIBUTING、风格文档、反复出现的审查评论)。每个符合“永远不要做 X”模式的模式都应作为一个条目,带有自己的 message、expected 和 fix,其编写应像内置规则一样谨慎。
    • no-deprecated-apis:列出 tsconfig 文件;一个 monorepo 希望每个应被检查的项目都在 options.projects 中。
  4. 使用 guidelines 将现有项目文档关联到规则上。 如果仓库中存在 AGENTS.md、CLAUDE.md 或包含规则强制执行的标准的风格文档,请映射它: "guidelines": {"AGENTS.md": ["tsdoc-coverage"]}。只有在项目的标准替换了附带的指导方针而非添加上下文时,才使用每条规则的 docs 字段。

  5. 对分开的标准使用数组形式。 一条规则可以多次运行,每次使用不同的 glob 和选项:

    "max-file-size": [
      {"include": ["src/**"], "options": {"maxKb": 256}},
      {"include": ["assets/**"], "options": {"maxKb": 4096}}
    ]
    
  6. 在遗留代码库上使用 --changed 增量采用,而不是削弱规则。 立即检查新工作(npx vibator --changed,或在 CI 中使用 --since origin/main 检查整个 PR 的差异),同时逐步减少历史积压。对于有大量发现项的规则,临时使用 warn:发现项仍可见但不阻塞构建。不要用 off 来表示“稍后处理”。

  7. 验证结果。 运行 npx vibator 并确认:每个启用的规则都运行了(崩溃的规则是配置错误,其消息会指出缺少什么),剩余的发现项是真实的,并且 npx vibator explain <rule> 为你覆盖的任何内容显示了正确的指导方针。

在共享预设上构建

extends 接受以 . 开头或包说明符的路径,相对于声明它的文件进行解析。后面的条目覆盖前面的,并且文件自身的设置覆盖所有扩展。

{
  "extends": ["@acme/quality/vibator.json"],
  "rules": { "max-file-size": "warn" }
}

合并遵循 Biome 的行为,因此该工具栈的用户可以预期其工作方式。有两个需要正确理解的结果:

  • 纯严重级别会保留所有其他内容。 在设置了 maxKb 和 include 的预设上编写 "max-file-size": "warn" 只会更改严重级别;预算和 glob 会被继承。你无需重新声明它们,而重新声明正是项目悄然偏离预设的方式。
  • 数组替换而非连接。 要向继承的 allow 或 patterns 列表添加一个条目,请编写你想要的完整列表。这是有意为之:它使得移除继承的条目成为可能。

只编写差异部分。一个重复预设已说内容的配置与一个与之矛盾的配置无法区分,并且下一次预设更新不会触及你复制的字段。

一个以精选集合形式构建的预设会设置 "recommended": false 并列出它想要的规则。在这种预设下,未命名的规则不会运行,因此在断定某规则缺失之前请检查这一点。

指导方针路径的解析方式相同:预设声明的 docs 和 guidelines 条目相对于预设解析,因此发现项指向与其一起提供的文档。你自己的路径仍相对于项目根目录解析。

严重级别策略

  • error:确定性规则,误报率接近零。
  • warn:可能对未见过的代码库判断错误的规则(env-example-sync 匹配文本;prefer-array-methods 无法区分数组和 Set),以及拥有大量积压的规则在临时采用时。
  • off:仅用于不适用的规则(没有语言环境意味着没有 locale-parity),绝不用作通过的方式。

常见错误

  • 编写 include 从而丢失了规则的默认排除项(测试、.d.ts)。
  • 在严重级别覆盖旁边重复预设的选项,以为纯严重级别会丢弃它们。实际上不会,并且复制的副本会停止跟踪预设。
  • 启用了 codegen-drift 却使用了需要环境不提供的服务或密钥的生成器。该规则会真正运行命令。
  • 在 guidelines 中将每个文档映射到每条规则。只映射那些实际陈述该规则的标准的文档。
  • 编辑配置以结束失败的运行,而不是修复发现的问题。如果人类要求设置门禁,只有人类才能决定降低它。

相关技能