关于 lint-rule-development
这项开发技能指导如何在 Biome 中编写 lint 和 assist 规则,涵盖查询设计、诊断、代码操作、选项、文档、测试夹具及代码生成。
主要功能
- 01选择分析器查询与状态
- 02生成规则脚手架
- 03编写诊断和代码操作
- 04配置选项与文档
- 05添加测试夹具并运行定向测试
- 06重新生成规则产物
适用场景
- 01添加 JavaScript lint 规则
- 02为某种语言创建 assist 规则
- 03测试诊断和自动修复
- 04更新 Biome 生成的规则配置
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ biomejs/ biome --skill lint-rule-development安装后在 Claude Code 中输入/lint-rule-development确认已加载。
详细介绍
Lint 规则开发
遵循 crates/biome_analyze/CONTRIBUTING.md 中当前的分析器架构。只阅读与规则相关的章节,不要默认加载整份指南。
工作流
- 在相同语言和分组中,查找两到三个查询方式或操作相似的现有规则。
- 添加分析器行为时,生成相应的 lint 规则或 assist 脚手架。
- 实现范围最窄的查询和状态,以判断是否应发出信号。
- 添加诊断,并在安全时添加操作。
- 添加有针对性的有效和无效 fixture,然后检查快照。
- 运行所需的分析器代码生成和范围最窄的测试。
脚手架命令:
just new-js-lintrule useMyRule
just new-css-lintrule useMyRule
just new-json-lintrule useMyRule
just new-graphql-lintrule useMyRule
新的 lint 规则从 nursery 开始。它们是针对 main 的补丁变更,因为 nursery 规则不遵循常规的功能版本管理策略。加载 changeset 以创建发布条目。
对于新的 assist,请使用该语言的 new-*-assistrule 配方,例如:
just new-js-assistrule useMyAction
just new-json-assistrule useMyAction
生成器会将 assists 放在 src/assist/source/ 下;它们不使用 lint 分组或 nursery 策略。新的 assist 是面向用户的功能,通常需要针对 next 的次要版本 changeset。现有 assist 的错误修复遵循常规错误修复策略。查看 justfile,了解哪些语言支持 assist 脚手架。
查询与状态
选择能够回答规则需求且成本最低的查询:
- 用于语法局部检查的
Ast<Node>; - 当需要绑定、引用、作用域或全局变量时使用
Semantic<Node>; - 仅当事实归属于某项服务时才使用服务查询;
- 仅当语法和语义模型都无法回答问题时,才使用类型推断。
大多数规则只需要其中一种。只有需要在整个遍历过程中保留状态的规则,才应使用带有自定义 Visitor 的 Queryable。
分析器指南中有关查询和服务的章节,是可用 API 的权威说明。
run() 应决定是否发出信号。将仅用于操作的工作放在 action() 中,避免对每个候选节点都执行。
优先在 State 中使用范围、语法节点、令牌和紧凑枚举。从语法文本构建 String、Box<str> 或集合,通常意味着存在可避免的分配;在持有源文本前加载 syntax-text-handling。
在 run() 中遍历子树或扫描令牌之前,以及编写自定义 Visitor(必须实现 visited_kinds)之前,都要加载 syntax-text-handling。
对于匹配全局标识符的规则,必须证明引用解析到的是全局标识符,而不是局部遮蔽项。覆盖节点联合类型和框架特定语法族中的所有相关成员。
诊断
每条诊断都要回答三个不同的问题:
- 发现了什么情况?
- 为什么这是个问题?
- 用户应该怎么做?
消息回答第一个问题。建议回答第二个问题;当没有操作时,也回答第三个问题。存在自动修复时,代码操作及其标签通常会回答第三个问题。
加载 diagnostics-development,了解消息结构、标记、详情、建议、类别和独立的 Diagnostic 类型。不要在规则实现中重复其中的指南内容。
操作
在 action() 中构建变更。只有在任何可达输入都不会改变行为时,才设置 FixKind::Safe。如果安全性取决于规则无法证明的假设,则使用 Unsafe。
测试应用操作后是否:
- 生成有效语法;
- 保留注释和 trivia;
- 不会再次触发同一规则;
- 对安全修复保留语义;
- 能处理
run()接受的每一种语法变体。
使用具有相同变更形式的现有规则作为 API 示例。
选项
仅为真正的语义模式或已有的冲突偏好添加选项。不要添加推测性的灵活选项。
以规则在 crates/biome_rule_options/src/ 下生成的文件或已有文件作为唯一准则。请遵循分析器指南中的 Rule Options、Merge 和 Documenting Options 部分,了解当前的派生项、合并行为、配置示例和 rustdoc 要求。
检查以下集成点:
- 规则的
type Options; - 未设置选项时,默认值应保留原有行为;
- 扩展配置应按照选项类型的约定进行合并;
- 为每种行为准备包含
options.json的 fixture 目录; - 规则 rustdoc 应说明每个选项的默认值,并展示其用法;
just gen-rules和just gen-configuration应更新注册信息和配置。
如果源 ESLint 规则包含 biome migrate eslint 应保留的选项,请加载 eslint-migrate-options。
规则文档
declare_lint_rule! 和 declare_assist_rule! 内的 rustdoc 面向终端用户,是网站内容,而非内部 API 文档。
- 用一句单行摘要说明行为。
- 解释被报告的模式为何有问题。
- 将
### Invalid示例放在### Valid示例之前。 - 根据当前的 rules-check 语法标记示例。
- 对于每个选项,都应说明默认值、展示配置,并提供应用后的示例。
- 不要仅仅为了规避验证而使用
ignore。
编写示例前,请查看相邻规则的文档和分析器指南。
测试与生成
加载 testing-codegen,了解 fixture 命名、预期注释、.jsonc 用例、快照审查和清理规则。
常见的定向命令:
just test-lintrule useMyRule
just gen-rules
just gen-configuration
根据 AGENTS.md 的要求运行 just f 和 just l。
审查清单
- 查询范围不超过所需范围。
- 通过语义模型处理全局变量和变量遮蔽。
State避免不必要地持有源代码文本。- 仅限操作的工作应延后到
action()中执行。 - 安全修复应保留语义。
- 默认值应保留现有行为。
- 有效、无效、选项、抑制和修复用例应覆盖变更涉及的分支。
- 包含所需的生成产物。
- 面向用户的诊断信息和 rustdoc 应解释行为,而不是实现细节。
参考资料
- 分析器指南:
crates/biome_analyze/CONTRIBUTING.md - 规则实现:
crates/biome_*_analyze/src/lint/ - 规则选项:
crates/biome_rule_options/src/ - 测试 fixture:
crates/biome_*_analyze/tests/specs/