@collabb/hammurabi

中文文档
0.6.0发布于 2026/10/19MITTypeScriptES Module构建来源已验证近 30 天下载 3031

花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花 信任您的输出而不重读每个 diff .

中文使用文档
文档目录19 节
  1. 为什么
  2. 安装
  3. 国 际
  4. 斜线命令
  5. 司马
  6. 撰写指南
  7. 导入合同——不再重新编码
  8. 镜像您的作品验证器库和配置
  9. 使用外部解析器的套件必须安装
  10. 这个 eval 块- 前题中的法官面板
  11. 供应商
  12. 决定性( 计分码) 标准
  13. 界定某些固定装置的标准—— appliesTo
  14. 运行者
  15. 法官小组
  16. 审计线索
  17. 目标种类
  18. 吸烟试验
  19. 版式

汉谟拉比

花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花 一个小的,有意见的框架 编写LLM评价 你将真正信任.

npm

状态 : α (v0. 3. 0) (中文(简体) ). 盘上装载器,CLI跑车,a 多供应商 评委面板(Anthropic + OpenAI + Google + DeepSeek + Fireworks + 任意OpenAI相容主机) 在 spec 前题中配置, (中文(简体) ), 确定性计分标准, (中文(简体) ), 基线意识退出语义 (已知故障级), 导入分辨率飞行前,基线回归探测,以及回波范围 hammurabi-check CI命令全部运出. 斯克马斯使用Zod v4.

为什么

团队在可以信任输出而不重新读取每个diff时,会更快地飞出. Hammurabi是连接组织:用于任何跑道(或下游工具,如: 纳克)可以消耗.

安装

npm install @collabb/hammurabi

或直接运行 CLI 不安装:

npx @collabb/hammurabi hammurabi-run path/to/foo.spec.md

国 际

Hammurabi轮船用来判断捆绑物和用于非互动性的 提议 / 选择 / 锁流( 通过 npm bin 安装后可用) .

hammurabi-run - 一个捆:

hammurabi-run path/to/foo.spec.md \
  --aggregator min \
  --filter foo-001,foo-007 \
  --update-baseline

法官小组决定 eval 块(见下文); CLI 旗帜 超过它。 一个兄弟 foo.baseline.report.json 自动发现 回归检测( e)--no-baseline 跳过, --update-baseline 祝福一个 (见A/CN.9/WG.III/WP.96,第1段)。 写作 foo.report.json 财务报告和审定财务报表 foo.report.md 与 spec 并列(或 单位) --out <dir>) (中文(简体) ).

hammurabi-check ——目录下的每一捆(CI入门点):

hammurabi-check evals/

发现每个 *.spec.md并按预定的基线运行 合计为1 check-report.json + 合并退出代码.

退出代码(两个宾箱)都具有CI意义和 基线认识 (自0.1.1起):

  • 0 ——无新故障(vs基线)和回归
  • 1 - 任何新的失败(在基线中通过固定,现在失败)或回归
  • 2 无法运行( 错误的参数、 错误的捆绑、 跑道错误、 未解决的导入)

在承诺的基线地表上完全没有固定的 known-fail (baselined) 警告,不要破裂大门 一个诚实的基线,不是100%的绿色 仍然可以坐在CI。 基线d 现在通过表面的固定 improvement 提示通过 --update-baseline。 。 。 .

在打分前, 两箱 每个动态导入 捆绑使用 (功能目标模块+代码评价模块). 无法解答的道具出口 2 带有精确信息,指定标准或目标。 跳过 --no-preflight。 。 。 .

运行 hammurabi-run --help 编号 : hammurabi-check --help 为全旗列表。 A 类 滴入的 GitHub 动作模板位于 templates/eval-gate.yml。 。 。 .

hammurabi-propose 编号 : hammurabi-select 编号 : hammurabi-lock - 转动任务 源到内容隐藏的锁。 没有提示和模式呼叫。 打电话的人 提供决定草案作为JSON;hammurabi验证、正常化和散列. 从任务列表复选框中读取选择, 以及一个明确的选择文件 推翻每个决定的复选框。 锁是写给Stdout的,或者 --out。 。 。 . --publish 财务报告和审定财务报表 --post 这是唯一的写作, 而且两者都是选择进入.

hammurabi-propose --source github-issues:owner/repo#32 --in draft.json > proposal.json
hammurabi-select --proposal proposal.json --source text:./tasks.md > selection.json
hammurabi-lock --proposal proposal.json --selection selection.json > lock.json
hammurabi-lock --verify lock.json

github-issues 读取 owner/repo#N 与 GITHUB_TOKEN (可选的 API 基础 : HAMMURABI_GITHUB_API) (中文(简体) ). text 读取下调任务列表,或 - 为斯丁. 复选框区域坐到 a 下 D1 标题(## D1 ... 或者说 **D1 ...**) (中文(简体) ). contentHash 实值 sha256: 超过RFC 8785 Canonial JSON的锁,不包括 contentHash, (中文(简体) ), lockedAt,以及 lockedBy。 。 。 .

hammurabi-verify ——离线检查取出的问题LOCK. 没有网络和标志.

hammurabi-verify --issue-json issue.json --allowlist allowlist.json

issue.json 是问题机构加评论. allowlist.json 是GitHub 登录的 JSON 阵列. lockedBy 是最后一个 LOCK 注释 user.login。散列是 sha256: 超过问题机构的RFC 8785 Canonical JSON,并且必须与该评论相匹配. 印刷品 {ok, reason, lockedBy, hash} ,当锁有效时退出 0,当锁无效时退出 1.

提议/ 选择/ 锁定的退出代码 :

  • 0 没事
  • 1 ——验证或验证失败(未决定决定,超选,提案不匹配,散列不匹配)
  • 2 无法运行( 错误的参数、 缺少源、 证书或网络错误)

斜线命令

把它们复制到任何项目 .claude/commands/数字 :

cp node_modules/@collabb/hammurabi/commands/*.md .claude/commands/
  • /hammurabi <path-to-spec.md> - 4个步骤的作者流:通过QQA来精炼光谱 出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出入出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出入出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出
  • /hammurabi-run <path-to-spec.md> ——援引CLI,再以聊天方式总结报告(失败,回归,错误的定着,法官投票)

司马

手工类型, 磁盘上所有语言中性 :

艺术格式TS 类型
光谱*.spec.md (前题+正文)Spec
鲁布里克语Name*.rubric.jsonRubric
固定设备*.fixtures.jsonlFixtureSet
提议贾森Proposal
选择贾森Selection
锁定贾森Lock

报告是JSON: Report 类型.

import type { Spec, Rubric, FixtureSet, Report, Proposal, Selection, Lock } from "@collabb/hammurabi/schema";
import { run } from "@collabb/hammurabi/runner";

撰写指南

三个模式 总是咬 第一次捆绑的作者。 收养他们 在您撰写标题之前。 见 docs/authoring-guide.md 为长式走过.

导入合同——不再重新编码

如果您的目标输出出符合计划、 JSON 光谱或函数的输出 签名, 您的评审员应当导入目标使用的相同定义。 。 。 . 将密钥列表、类型形状或验证规则复制到评估者手中 保证目标第一次改变时漂移。 错误的常见形式 : (单位:千美元) requiredKeys 数组漂移出源代码同步 *.schema.json,则 门无声地腐烂了,而标题报告为不符合要求的输出为绿色.

镜像您的作品验证器库和配置

如果 eval 镜像 生产 验证器 (ajv, (中文(简体) ), zod, (中文(简体) ), joi,...) 针入 同一个主要版本 生产代码使用和应用 相同的配置 (单位:千美元)formats, (中文(简体) ), coerceTypes, (中文(简体) ), strict(中文(简体) ). ajv 8 名评价员 ajv 6 生产代码不是同一门.

使用外部解析器的套件必须安装

导入的捆绑目录 npm 软件包必须包含 package.json 与宣布的道具。 依靠"母项目碰巧举起" 断开文件 hammurabi-check evals/ 使用捆绑时的大小写 运行在 CI 工作空间或新检查中。 自0.1.1起,两个CLI机箱都在飞行前 每一次动态导入,在打分和发出指向 违法的标准或目标——根由的固定仍然是被宣布的dep.

这个 eval 块- 前题中的法官面板

如何严格地判断一个类别—— 小组的规模和推理 —— 说 生活在光谱的前题 eval 块,所以它是 版本控制 可审查而非暂时的CLI旗:

---
name: trade-sizer
version: "1.0.0"
description: ...
target: { kind: http, url: https://... }
eval:
  riskTier: critical          # shorthand → a default cross-provider panel
  aggregator: min             # any single judge flagging a problem fails it
  generatorProvider: anthropic # warns if a judge shares this provider
  judges:                     # ...or spell the panel out explicitly
    - { provider: anthropic, model: claude-opus-4-8,   role: primary,    reasoning: high }
    - { provider: openai,    model: gpt-4o,            role: secondary,  reasoning: none }
    - { provider: google,    model: gemini-2.5-pro,    role: tiebreaker, reasoning: medium }
---
  • riskTier (单位:千美元)low | medium | high | critical) 扩展为默认值 通过面板 RISK_TIER_PRESETS 高级意味着更多的法官,更多的提供者, 更多推理,更保守的汇总。 以明白的方式克服其中任何一种 judges 编号 : aggregator。预设仅使用Anthropic/OpenAI/Google; 深网、烟花和 openai_compatible 选择进入 - 通过一个 明确 judges 输入.
  • reasoning (单位:千美元)none | low | medium | high qq 象征性预算) 映射到 每个提供者的机制: Anthropic 扩展思维, OpenAI reasoning_effort双子座思维预算 DeepSeek deepseek-reasoner。 。 。 .
  • 减少交叉提供者的偏见 任何法官都不得分享产出 提供商(同一家庭模式对其本身的作风进行宽大评价)。 设定 generatorProvider 当法官与它相撞的时候,跑者将警告它.

决议优先性:CLI/RunOptions 覆盖 > 翻译: eval.judges > 翻译: eval.riskTier 预设 > 翻译: 一个缺席的海库法官.

供应商

提供者密钥环境 var基础 URL页:1
anthropicANTHROPIC_API_KEYAI_GATEWAY_URL 覆盖原生结构输出+扩展思维. 缺席法官.
openaiOPENAI_API_KEYOPENAI_BASE_URL 覆盖严格 json_schema 模式; reasoning_effort 在o系列/gpt-5.
googleGEMINI_API_KEY (或 GOOGLE_API_KEY(中文(简体) )—— 说JSON MIME类型+思维预算.
deepseekDEEPSEEK_API_KEYDEEPSEEK_BASE_URL 覆盖原生DeepSeek API(OpenAI有线格式).
fireworksFIREWORKS_API_KEYhttps://api.fireworks.ai/inference/v1 (覆盖 : FIREWORKS_BASE_URL(中文(简体) )一等烟花服务. 模型字符串传到线上 逐字记录 (单位:千美元)accounts/fireworks/models/...) (中文(简体) ).
openai_compatible法官入口处 api_key_env法官入口处 base_url (必须)任意 OpenAI 兼容主机的逃出舱门(Together, vLLM, 一个网关,...).

fireworks 只需要钥匙; openai_compatible 命名其终点 键入 var 法官的条目本身,所以一个面板可以混合多个 主机 :

eval:
  judges:
    - provider: fireworks
      model: accounts/fireworks/models/deepseek-v3p1
      role: primary
    - provider: openai_compatible
      model: kimi-k2-instruct
      base_url: https://llm.example.com/v1
      api_key_env: EXAMPLE_LLM_KEY
      role: secondary

base_url编号 :api_key_env 用于 openai_compatible 并被拒绝 每一个提供者(他们的终点都是在其中建造的). 缺少的密钥 Ev var 在任何固定执行前拒绝运行,指定变量(runner failed: /出处2. 法官在呼叫时间出错(超时,529,分析) 被排除在总量之外 跑者警告过一次 excluded from the aggregate。两个提供者发送精确 在 DeepSeek- vi- Fireworks 上验证了请求形状: 不合理调用针 reasoning_effort: "none", (中文(简体) ), temperature: 0 和 JSON 对象 模式; 思维调用省略温度/应答 格式并标出 JSON 形状 穿过电源.

设定您使用的提供者密钥 : ANTHROPIC_API_KEY, (中文(简体) ), OPENAI_API_KEY, (中文(简体) ), GEMINI_API_KEY, (中文(简体) ), DEEPSEEK_API_KEY, (中文(简体) ), FIREWORKS_API_KEY. Base-URL 覆盖 为: 每个提供者 并且每个只调整自己的提供者的流量: AI_GATEWAY_URL (雅典语), OPENAI_BASE_URL (开放AI), DEEPSEEK_BASE_URL (深处), FIREWORKS_BASE_URL (烟花). 没有单个变量 通过一个网关向每个供应商传送.

折旧: DEEPSEEK_* (原始内容存档于2019-10-12). env-remap pattle. 指点 DEEPSEEK_BASE_URL 在非本地的 OpenAI 兼容主机( 如烟花) 仍在工作——非理性法官派 reasoning_effort: "none" 财务报告和审定财务报表 stema- construction JSON-object 模式, 而本地的 DeepSeek 调用( 未设置基数) URL 或 网络 https://api.deepseek.com保持它们的形状不变。 但它重现 每个 穿过环境 隐蔽地判断 光谱 偏好 provider: fireworks (或 provider: openai_compatible 页:1 其它主机: 相同的电线形状, 在它所在的光谱前题中声明 版本控制和可审查。 关闭 16号。 。 。 .

决定性( 计分码) 标准

保留法官小组进行判决;让代码检查哪些代码可以检查 准确(召回、存在、格式、时间)。 附有一项标准 code 评价员通过导入一个函数来打分——没有法官呼叫,完美 可复制:

{
  "id": "semantic-recall",
  "name": "Semantic recall",
  "description": "Fraction of must-include elements present in the top-N.",
  "weight": 0.35,
  "scale": { "kind": "ordinal", "min": 0, "max": 1 },
  "evaluator": { "kind": "code", "module": "./evaluators.ts", "export": "semanticRecall" }
}

导出收到 { input, expected, output, fixture } 返回数字 或者说 { score, reasoning } 在标准的比例。 LLM 和代码标准组合 在一个标题中自由使用;一个没有LLM标准的标题使得零API呼叫.

界定某些固定装置的标准—— appliesTo

一些目标释放出多个形状:成功响应和错误 反应,或者一个CLI背后的几个行动. 写给其中之一的标准 对其他人没什么好说的 也没什么好说的 以传道而行. 要求法官弃权,这样做不合理——法官 偶尔得分0 而他们自己的推理说规则要求 通过。 不要问,标准等级输出 它从来没有看到, 持续低调.

appliesTo 把它写在标题上 适用标准列名标签 仅用于至少装有其中之一的固定装置:

{
  "id": "partition-integrity",
  "name": "Every parsed seed lands in exactly one bucket",
  "weight": 0.2,
  "scale": { "kind": "ordinal", "min": 0, "max": 1 },
  "appliesTo": ["collect"]
}
{"id": "parses-a-listing",  "input": {...}, "tags": ["parse"]}
{"id": "collects-a-page",   "input": {...}, "tags": ["collect"]}

奥米 appliesTo 并且该标准适用于每个固定点——默认,以及 每一个现有的标题做什么.

在评分前,放弃不适用的标准: 没有法官的电话, (中文(简体) ), 和固定的加权分数 重新正常化的标准做 应用。 重归正常是重点 整体重量为1.0 标题,所以没有它,一个固定的,其中适用6个标准中的3个被除以 重量从来没有在玩, 一个完美的答案盖以0.5.

有两件事是故意的:

  • 没有遗漏. 法官拒绝得分是一个故障——不包括在 以及一个标准,没有法官评分 错误的固定。 那个 高音对"不能评价"是正确的,对"不适用"是错误的. 不适用的标准列于每个表格中 FixtureResult.inapplicable 财务报告和审定财务报表 因此,坐以待毙是显而易见的,而不仅仅是缺席.
  • 无法代替拆分. 如果一个RUBRIC的标准 被违反 脱节团体与脱节团体的关系,即通常两种行为 两个包. appliesTo 这是真正跨越一个标准.

一个 appliesTo 标记捆绑载中任何固定都是负载时间错误—— a 在运行停留时, type 将会在任何地方禁用标准 绿色,读起来就像覆盖.

运行者

import { run } from "@collabb/hammurabi";

const report = await run({
  spec,      // panel comes from spec.frontmatter.eval unless overridden here
  rubric,
  fixtures,
  judges: [{ provider: "anthropic", model: "claude-haiku-4-5" }], // optional override
  aggregator: "min",
  baseline: previousReport,
});

法官小组

跑步者判断每个固定器的输出 可配置的LLMS面板,通常写在 spec's eval 块这些 RunOptions 控制它进行一次性运行。 默认(无 eval 块,无 覆盖)是单一的 Haiku 4.5 法官.

选项默认页:1
judges从 eval 块, 否则 [{ provider: "anthropic", model: "claude-haiku-4-5" }]法官配置阵列provider, (中文(简体) ), model, (中文(简体) ), role, (中文(简体) ), reasoning, (中文(简体) ), weight) (中文(简体) ). 小组的呼叫是平行进行的.
aggregator"mean""mean" | "median" | "min" | "max" 或习惯 (scores: number[]) => number应使用对风险敏感的呼叫者 "min"。 。 。 .
regressionThreshold0.05每平方位加权分数三角洲,下方标出回归与基线.
execute—— 说所需经费 target.kind === "free-form"自定义返回给定输入输出的执行器.

费用说明:面板大小乘以线性成本. 由2名法官组成的分庭费用为2×1名法官。 长相间隔时间大致不变(小组电话通过 Promise.all) (中文(简体) ).

审计线索

每个 CriterionScore 报告中保留了小组的全部表决票数:

{
  criterionId: "is-uppercase",
  score: 0.5,                     // aggregated
  reasoning: "[claude-haiku-4-5] ...\n\n[claude-sonnet-4-6] ...",
  judgeVotes: [
    { model: "claude-haiku-4-5", score: 1, reasoning: "..." },
    { model: "claude-sonnet-4-6", score: 0, reasoning: "..." },
  ],
}

如果法官错误或省略了某项标准,其投票结果仍为: judgeVotes 带有 error 字段——但它是 不包括在总数内,所以一个 短暂的失败永远不能捏造出低分和虚假的回归. A 类 标准 没有 法官可以给错误的固定标记(qq),永远不要 失败( QQ) , 并且仍然行走一个非零 CI 出口, 所以它不能默默通过 .

目标种类

Spec.frontmatter.target 是标记的联盟 :

kind所需字段跑者如何执行
clicommandShell-exec;固定输入被管道接通为Stdin为JSON;stdout解析为JSON(倒回纯文本).
functionmodule, (中文(简体) ), export动态 import(module),电话 module[export](input)。模块路径应从调用者的解析上导入.
httpurl选项 method (默认) POST(中文(简体) )fetch 与 application/json 躯体.
free-formdescription电话 options.execute(input)时 kind 实值 free-form。 。 。 .

吸烟试验

npm install
npm run smoke

要求数 ANTHROPIC_API_KEY (可选) AI_GATEWAY_URL cloudflare AI Gateway 路由).

小组吸烟:

HAMMURABI_SMOKE_JUDGES="claude-haiku-4-5,claude-sonnet-4-6" HAMMURABI_SMOKE_AGGREGATOR=min npm run smoke

预期费用:单名法官运行为0.02美元,包括Sonnet在内的2名法官小组运行为0.10美元.

版式

hammurabi/
├── src/
│   ├── schema/       # Spec, Rubric, Fixture, Report types
│   ├── loaders/      # On-disk parsers (*.spec.md, *.rubric.json, *.fixtures.jsonl)
│   ├── runner/       # Execute fixtures + judge panel + score
│   ├── cli/          # hammurabi-run CLI + Report → markdown renderer
│   └── index.ts
├── commands/         # /hammurabi, /hammurabi-run
├── examples/smoke/   # End-to-end smoke (inline + disk variants)
├── tests/            # Unit tests (tsx --test)
└── plans/            # Approved implementation plans

版本与发布记录

@collabb/hammurabi 共发布 12 个版本,首次发布于 2026/06/06;过去 12 个月发布了 12 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.6.0latest2026/10/1922 天前
0.5.12026/10/1625 天前
0.5.02026/10/1625 天前
0.4.12026/09/042 个月前
0.4.02026/08/063 个月前
0.3.02026/07/094 个月前

关于 @collabb/hammurabi 的常见问题

@collabb/hammurabi 是什么?

花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花 信任您的输出而不重读每个 diff .

如何安装 @collabb/hammurabi?

在项目目录运行 npm install @collabb/hammurabi,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 hammurabi-run、hammurabi-lock、hammurabi-check、hammurabi-select、hammurabi-verify、hammurabi-propose,可以用 npx hammurabi-run 直接运行。

@collabb/hammurabi 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@collabb/hammurabi 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@collabb/hammurabi 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@collabb/hammurabi 可以商用吗?

@collabb/hammurabi 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@collabb/hammurabi 的下载量有多少?

根据 npm 官方下载统计,@collabb/hammurabi 在 2026/10/11 – 2026/11/09 这 30 天内被下载 3,031 次,日均约 101 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@collabb/hammurabi 还在维护吗?

最新版本 0.6.0 发布于 2026/10/19(22 天前);至今共发布 12 个版本,其中过去 12 个月发布了 12 个;首次发布于 2026/06/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。