# @ai-ecoverse/wasix-gnupg 中文文档

规范地址：https://npmcn.com/package/%40ai-ecoverse/wasix-gnupg/

版本：2\.4\.9-17
npm 元数据更新时间：2026-10-25T22:50:29.358Z
中文译文更新时间：2026-11-06T08:10:19.096Z
软件包许可：GPL-3\.0-or-later

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40ai-ecoverse/wasix-gnupg
原文对照：https://npmcn.com/package/%40ai-ecoverse/wasix-gnupg/?lang=original
项目主页：https://github.com/ai-ecoverse/homescoop#readme
源码仓库：https://github.com/ai-ecoverse/homescoop

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：8.7 MB，24 个文件
- TypeScript 类型：未声明
- 运行依赖：0 个
- 首次发布：2026-10-02T16:53:20.257Z
- 最新版本发布：2026-10-25T22:50:28.973Z
- 近 30 天下载量：3973（2026-10-05 至 2026-11-03，npm 官方下载统计）
- 已发布版本数：16（近 12 个月 16 个）

## 中文简介

GnuPG 2.4:OpenPGP加密并用gpg,gpgv和gpg-agent签名.

## 安装

```sh
npm install @ai-ecoverse/wasix-gnupg
```

也可以使用：`pnpm add @ai-ecoverse/wasix-gnupg`、`yarn add @ai-ecoverse/wasix-gnupg`、`bun add @ai-ecoverse/wasix-gnupg`

## README

# `@ai-ecoverse/wasix-gnupg`

GnuPG 2.4 用于 slic sem 域(WASIX): `gpg` (另见: `gpg2`, (中文(简体) ), `gpgv`, (中文(简体) ), `gpg-agent`, (中文(简体) ), `gpgconf` 财务报告和审定财务报表 `gpg-connect-agent`. libgpg-error, libgcrypt, . . . , libassuan,libksba和npth是静态连接的.

```bash
gpg --batch --passphrase '' --quick-gen-key 'Me <me@example.com>' default default never
echo hi | gpg --clearsign | gpg --verify
git config --global gpg.program gpg && git commit -S -m signed
```

-   **密钥环**数字 : `~/.gnupg` (或 `$GNUPGHOME`在VFS上进行. 在块状内核上 1.35.1 文件获得通常的模式(homedir和 `private-keys-v1.d` 700,钥匙和 `trustdb.gpg` 600)和gpg's (中文(简体) ) "不安全许可"检查工作;更老的内核留给他们755/644.
-   **gpg 剂** 从第一次使用开始, 脱去, 然后命令到达它 结束 `$GNUPGHOME/S.gpg-agent` 在王国的回回名空间。 这个 缓存密码句和往常一样`default-cache-ttl`) (中文(简体) ).
-   **密码句**:没有针入程序. `gpg` 默认为 `--pinentry-mode loopback` 并在终端上询问(`/dev/tty`页:1 当它用管子运行时 没有终端(代理机) `bash` 工具,使用无保护的密钥,或 `--batch --passphrase-fd`。 。 。 .

## 2.4.9-17 (简体中文)

-   **一个大小的堆积和分配器刷新** (homescoop#1879,#1287). 五个二进制是带共享内存的串接相接的相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相相相接相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 `memory access out of bounds` 当一个线程填充或复制到另一个线程的页面 `malloc` 刚刚成长(ai-ecoverse/slic-内核#1172). 2.4.9-17 建于黄道2025.9.30-43:其 `malloc` 在返回上方的块(-39)之前刷新线程对内存的视图,并在生长(-40)前使用初始内存. 现在每个模块从64 MiB开始(大约是8.3 MiB);gpg和gpg-agent在启动时会为libgcrypt的安全内存添加一页64 KiB. gpg需要大约9个MiB. gpg-代理需要8.3个MiB外加8个线程堆栈,每个同时连接的客户端:5个并行客户端(密钥生成,密钥导入,签名和解密)达到48.5个MiB的峰值,因此一次有少数客户端从未长出内存,在刷新下会更能长出(13个带给112.6个MiB). 证书同时通过一个代理人处理这两个案件,没有陷阱.
-   **自34年以后,其他的变迁** (-35至-43):信号处理器的 `sa_mask` 将获得荣誉;一个现成的描述者将赢得一个即将到来的信号 `pselect`gpg-agent的主要循环用途; `S_IF*` 文件类型比特是Linux的;相对路径通过cwd描述符; `gethostname()` 读取 `/etc/hostname`. gpg不依赖于其中任何一个,超出证书检查范围:每个现存行都通过不变.
-   **根的拒绝在打开的窗口 说哪张支票被解雇了** (homescoop#1879,homescoop#1603). 当 root 的 gpg 读取目录中的密钥盒、 密钥环或信任b 时, 用户可以使用 `fstatat(AT_SYMLINK_NOFOLLOW)` 打开它 `openat(O_NOFOLLOW)` 同为 `st_dev`编号 :`st_ino`。 。 。 . `O_NOFOLLOW` 只有两个电话之间名称改变才重要 最多2.4.9-16 两次拒绝都记录在窗外 `it changed while it was being opened`现在 `ELOOP` 从打开的日志 `it became a symbolic link while it was being opened`,则 `st_dev`编号 :`st_ino` 不匹配保留了旧措辞 。 支票本身没有改变 两者都拒绝 `Operation not permitted`。 。 。 .
-   **O NOFOLLLOW行在斯克-内核上 1.146.6.** 1.144.1 拒绝在下方进行最后的连锁 `O_NOFOLLOW`,和1.146.3和1.146.6 在同一步骤中为线程程序绑定描述符。 证书显示在1.146.6上: `O_NOFOLLOW` 打开一个 dangling 链接、 用户文件链接和 root 600 键盘链接 `ELOOP`,通过绝对路径和相对于cwd,用于root和一个用户. 它还运行着一个种族:用户将一个同名链接重新命名为root的600个密钥箱和一个他们自己的密钥箱,然后在root的密钥箱中转而一个名字 `gpgv` 检查签名60次。 根从不读取链接. 1.146.6 窗户上的拒绝是 `ELOOP` 从 `O_NOFOLLOW` 60分中的14至16分在当地运行),在cert内核1.124.1上,它们的开口跟随链接,它们就是 `st_dev`编号 :`st_ino` 检查(60分之19至24)。 所以支票才会留下.

## 2.4.9-16 (中文(简体) )

-   **Root拒绝对齐键盘 说为什么** (homescoop#1674) (英语). 自2.4.9-15起,root's gpg只跟随一个共通键箱,键圈或信任b,只存在于一个拥有root的目录中,并且其组或其他人都无法写出. 在其他地方,它拒绝 `Symbolic link loop`,它读作文件系统错误。 它现在说,它拒绝哪个文件,为什么,和该怎么办, 一旦每个文件和运行 `Operation not permitted`数字 :
    
    ```text
    gpg: refusing to open '/tmp/gw/pubring.kbx' as root: it is a symbolic link, and its directory '/tmp/gw' is group-writable (gid 0), so another user could have put it there; make the directory writable only by root (chmod go-w '/tmp/gw') or use a regular file with one link
    ```
    
    在目录根不拥有的情况下,提示是使用正则文件,或者将链接保留在一个只有根才能写的目录中. 一个有多个硬链接的文件,或者在 gpg 打开时更改它的文件,同样被拒绝.
    
-   **拒绝本身就留下了.** 一个组-writable homedir让其组中的任何成员去掉root的链接并置入自己的位置,root的gpg打开文件时无法将两者区分开来. 证书显示2.4.9-14:一个加入的用户 `root` root 生成 setgid 后组 `root:root` 2775目录, 和一位成员 `users` 在一个 `root:users` 2775个,每个对称 `pubring.kbx` 到一个只有 root 才能读取的键框, root 导入了那里的密钥, 然后用户从 644 读取 root 的密钥 `pubring.kbx` 财务报告和审定财务报表 `pubring.kbx~` 它写着。 "组只有根"也不例外:组成员可以随时被添加(slic-内核的) `groups.addMember`,或 `users.add` 与 `groups`),并且 setgid只设置了新文件组,而不是谁可以写入。 所以,保留根的主目录 `chmod 700` (或至少 `go-w`),或在那里使用正则文件.
    
-   **更多证书行** (homescoop#1424):一个默认遗产的homedir `pubring.gpg` (无) `pubring.kbx`)一个用户与root的600密钥环的同义链接: 在root导入到那里后,任何用户都无法读取hold root的密钥而root的密钥环是字节-同义.
    

## 2.4.9-15 (简体中文)

-   **Root的gpg不再通过用户的同音链接读取一个键盘,键盘或信任b** (homescoop#1654号). 2.4.9-14拒绝通过一个被植入的名称来写作,但它仍然通过一个读取:当root's gpg跑到另一个用户的homedir上时,这个用户的homedir `pubring.kbx` 是链接到一个只有root才能读到的文件,它读到了那个文件,它为备份制成的复制件(`pubring.kbx~`),而更新的密钥箱是之后用户的文件,因此用户可以读取root的密钥箱. 也一样 `gnupg-ring:` 键盘 。 现在,每个读取的键盘、密钥环和信任b的开口都会通过与在位编辑相同的检查:对于root,名称必须是带有一个链接的正则文件,选中 `fstatat(AT_SYMLINK_NOFOLLOW)` 在目录的描述符上打开 `openat(O_NOFOLLOW)` 一样 `st_dev`编号 :`st_ino`,它涵盖了键盘的读取打开(搜索,列表,每个更新的来源),备份副本的来源,从键盘中告诉一个键盘的探针,键盘的读取打开并只读取信任b. 用户目录中的同义键框或密钥环使root的gpg失败(`Too many levels of symbolic links`),并按原样保留了同义链接及其目标;最高为2.4.9-14,取而代之的是用户拥有的同义链接副本. 在root拥有且只有root能够写入的目录中,root自己的同义链接会和以前一样被遵循,而其他用户的gpg也会和以前一样遵循链接.
-   **更多证书行** (homescoop#1424):root在位编辑(`--delete-secret-and-public-key`, (中文(简体) ), `--import-ownertrust`)在用户的正则密钥箱和信任b上,root在它的700个目录中的自有同义键箱和信任b, a `private-keys-v1.d` (单位:千美元) `pubring.kbx.lock` 将用户的同义链接到根目录中,并更新它所替换的正则密钥箱的所有者.

## 2.4.9-14

-   **Root的 gpg 从未通过一个用户所植入的符号链接写入** (homescoop#1607号). 当root的 gpg 更新了另一个用户的密钥盒时, 它会写备份 `pubring.kbx~` 与 `fopen("wb")`,当它创建一个键盘时,它写着 `pubring.kbx.tmp` 同样的方式。 两者都跟随同名链接,因此指向根文件的任一名称的用户会得到root来用键箱来覆盖它(而2.4.9-12也把它交给了该用户). 现在备份,每个更新的临时文件,一个新的键盘和 `pubring.kbx.tmp` 相对于目录的描述符创建 : `unlinkat` (它去除一个同义链接本身,从不它的目标),文件是用 `openat(O_CREAT | O_EXCL | O_NOFOLLOW)`,并且只有在 `fstat` 新描述和 `fstatat(AT_SYMLINK_NOFOLLOW)` 在名称上显示一个链接的相同正则文件。 解锁后植入的符号链 `O_EXCL` 失败, 而 gpg 报告错误而不是写入 .
-   **遗留的密钥环和吊销证书也** (homescoop#1607评论). A 类 `gnupg-ring:` 密钥环( e)`--keyring gnupg-ring:…`),其临时文件和新密钥环以同样的方式被创建,其权限通过已检查的描述符复制,而不是 `chmod` 以名为相. 吊销证书( E)`openpgp-revocs.d/<fingerprint>.rev`)与 `O_EXCL` 而不替换任何已经存在的东西,在一个 `openpgp-revocs.d` 必须是真实的目录(`fstatat(AT_SYMLINK_NOFOLLOW)` 从其父母,然后相同 `st_dev`编号 :`st_ino` 结束 `openat`在同一个描述符上交给了目录的主人。 指纹可以事先知道(`Key-Grip` 财务报告和审定财务报表 `Creation-Date` 修好它,所以一个被栽培的 `.rev` 拒绝名称而不是跟随: 该密钥不会获得撤销证书, gpg 也这么说 .
-   **现场编辑从不通过被植入的同音链接.** `--delete-key` (和其他在位键箱编辑) `pubring.kbx` 用于在原地写作,信任被打开读写方式相同。 当 root 这样做时, 文件必须是有一条链接的正则文件, 并选中 `fstatat(AT_SYMLINK_NOFOLLOW)` 在目录的描述符上打开 `openat(O_NOFOLLOW)` 一样 `st_dev`编号 :`st_ino`。否则 gpg 失败,而不是编辑链接名称的文件。 一个例外是root拥有并且只有root可以写出的一个目录,只有root才能制作链接;有root自己的共通设置持续工作. 其他用户的gpg跟以前一样跟随链接. 根创建的可信任b就像一个键箱文件一样被创建.
-   **已完成的临时文件被重新命名为 `renameat`** 在它的目录的描述符上,并且只有在它仍然是一个链接的正则文件时. 目录是用户的自有,所以一个在那里赢得比赛的用户只能替换他们自己的键盘,不管怎样他们都可以这样做.
-   **`openpgp-revocs.d` 它的吊销证书会转到主目录所有者那里** (homescoop#1602) (英语). 当 root 的 gpg 在另一个用户主目录中生成密钥时, 目录和 `.rev` 保留了 root , 这样用户无法删除 homedir 。 它们像键箱和信托b一样被移交,有相同的目录描述符检查.
-   **硅-内核 1.144.1** 拒绝在下方设置最后的链接 `O_NOFOLLOW` (homescoop#1603),而该证书也运行了上面的同音行. gpg 保持其状态 `fstatat` 财务报告和审定财务报表 `st_dev`编号 :`st_ino` 检查,因为一个有线性的WASIX程序在那里仍然有一个窗口,直到 slic-内核 #1394.
-   **二进制中没有构建路径** (homescoop#1601):自2.4.9-13起(libgpg-error配置于 `--sysconfdir=/etc`),无 `bin/*.wasm` 包含构建目录和证书检查.

## 2.4.9-13

-   **所有者交割通过一个目录描述符** (homescoop#1442) (英语). 当 root 的 gpg 在另一个用户目录中创建文件时(一个键盘,它的备份,一个可信任db,一个锁文件, `private-keys-v1.d`),它给了目录的主人. 最多 2.4.9-12 它按所有者的名字查看了目录,又按名称查看了文件的交接,因此,一个在路径上交换了目录的用户可以让root在根目录中送出一个文件. 现在它打开目录一次, 带走所有者 从描述器,检查名称 相对于它 `fstatat(AT_SYMLINK_NOFOLLOW)`,打开它,只交出相同的文件(`st_dev`编号 :`st_ino`),并只使用一个链接(或新目录)的正则文件. 支票不靠谱 `O_NOFOLLOW`: 在硅核上(1.124.1至1.143.5) `open` 与 `O_NOFOLLOW` 因此2.4.9-12的重开并没有拒绝在那里的同位素链接. 锁定文件是相对于该描述符创建的. 键盘更新仅当该键盘是同一目录中的正则文件时,它才会取代该键盘的主人,而永远不会通过一个符号链接:一个取代符号链接的键盘 `pubring.kbx` 属于目录的主人.
-   **委托人交接** (homescoop#1447)使用相同的代码. 2.4.9-12回归报告来自其PR(40b9ef7a)的中间头;出版的 2.4.9-12 将信任取出。 证书行现在要求信任存在,成为主人,为主人工作 `--clearsign`, (中文(简体) ), `--list-keys` 财务报告和审定财务报表 `--check-trustdb`。 。 。 .
-   **包裹装上它的承诺 `package.json` 财务报告和审定财务报表 `README.md`** (homescoop#1448) (英语). build.sh 用来写自己的 `package.json` 并复制一个更古老的README, 所以2.4.9-12的简单描述, `"helper": true` 打开 `gpg-agent` 和2.4.9-12的纸币从未发运。 他们现在知道了.
-   **可复制建筑** (homescoop#808):包被重建并比较于CI.

## 2.4.9-12 (简体中文)

-   **信任b 手动检查名称** (homescoop#1111) (英语). 当根的 gpg 创建 a `trustdb.gpg` 在另一个用户的homedir中,它通过名称本身将文件交给homedir的所有人:它以 `O_NOFOLLOW` 并给出了描述符, 只有当它是一个普通文件 与一个链接。 A 类 `trustdb.gpg` 根文件的圆锥连结 永远不会被移交.
-   **`gpg-agent` 是帮助命令** (单位:千美元)`"helper": true`gpg开始它,所以它不再列为你运行的东西.

## 未列入

gpgsm (S/MIME), scdaemon (智能卡), dirmngr (键服务器, CRLs),, 键框、 gpgtar 、 WKS 工具、 TOFU( 需要 SQLite) 、 压缩 (单位:千美元)`--disable-zip`: 其它 GnuPG 压缩后发送的消息不 解密已经).

## 已知的限制

-   WASIX没有会话或处理组(`setsid`编号 :`setpgid`) (中文(简体) ). 一个离子 gpg - agent 留在启动它的命令的处理组中, 所以 a ^C 到同一前置工作也到达代理(它关闭 下个 gpg 开始一个新的 .
-   `gpg-agent --daemon PROGRAM` (在代理下运行一个程序)需要叉 而不获支持.
-   根和相联(2.4.9-15, homecoop#1654,#1674):根的gpg如下 符号链接 `pubring.kbx`键环或 `trustdb.gpg` 仅在目录中 根是拥有的,而且其群体和其他人都无法写作`chmod 700` 或者说 `go-w`) (中文(简体) ). 任何地方,它拒绝文件和日志 `refusing to open '<file>' as root: …` 与理与修行相会. 一个链接的常规文件到处工作.
-   锁定文件 (2.4.9-8, housescoop# 712): gpg 的点锁持有一个 `fcntl` 写入 锁定 `<file>.lock` (单位:千美元)`pubring.kbx.lock`, (中文(简体) ), `trustdb.gpg.lock`页:1 slicc-内核 (≥ 1. 100. 0) 在进程之间执行, 当 持有者退出, 因此并行 gpg 运行在一个 homedir 上不再丢失密钥 并且没有坚固的锁可以移除。 高达 2.4.9-7 点锁倒回 改为: `O_EXCL` 锁定文件( OPFS 没有硬链接), 其种族: 运行 与“ ops,... ” 或“ 锁文件已消失” 失败 。 锁 档案留在原地。 自 2.4.9-10起, root 提供了它创建的锁定文件 另一个用户目录到该目录的拥有者(只有它创建的一个) 自己,从来没有一个名字已经存在过, 和gpg不能 打开锁文件用于写入, 如果没有进程将替换它 (homescoop#888) (英语). `gpgconf --lock`编号 :`--unlock` 没有支持: fcntl 锁以过程结束,所以没有锁能活过gpgconf, 并且都说 因此,失败(homescoop#881).
-   并联 gpg 运行于新家目录 (2.4.9- 9, homecoop# 712): gpg 读取没有锁的键盘并取出空的 `pubring.kbx` 用于 旧式键盘 最多 2.4.9-8 gpg 创建了空键箱并写入 之后它的标题,所以6个同时 `gpg --import` 运行到一个 新 homedir 有的失败 `invalid packet (ctb=00)` 失去了他们 键。 2.4.9-9 将新键框写入 `pubring.kbx.tmp` 并重命名它 中,这是从块状内核中进行其他过程的原子 1.117.2(引擎地板;ai-ecoverse/slic-内核#925). 已更新 将键盘替换为重命名及其备份(`pubring.kbx~`是一个 复制,所以键盘名称总是存在. 键盘短于一个 键箱头在锁下被探测,除非呼叫者能写 既不是锁文件,也不是其目录(只读的空密钥环) 目录, homecoop#955.
-   键箱更新 (2.4.9- 10, homecoop# 966): 在 slic-内核的 OPFS root a 以刚刚重新命名的名称创建的文件将获得重新命名 文件的inode编号(ai-ecoverse/slic-内核#954). 每名最多2.4.9-9人 更新已写入 `pubring.kbx.tmp`,因此所有版本的键盘 共享一个inode号码,和一个 `gpg -k` 随导入一起运行 有时失败 `keydb_search_next failed: Provided object is too short` (没有丢失密钥). 2.4.9-10 将每个更新写成 tmp name of 其本身(`pubring.kbx.tmp.<pid>.<n>.<time>`),如果更新则将其删除 失败 。 1. 123.1 修正 # 954 (ai- ecoverse/ slic- ennel# 963) . 独有名称保存在引擎层的内核 < 1.123.1 (1.117.2) 上调.
-   Root的 gpg 在别人的家目录上(2.4.9-11, homecoop#1031):一个键箱 或信任它在那里创建, 它更新的键盘, 更新的备份 `pubring.kbx~` 属于目录的(或被替换的键框的) homescoop#888)的锁文件, 之前, 导入为 root 左侧 `pubring.kbx` root自有和所有者的 gpg 找不到可写密钥环 。 只是个普通的 带有此 gpg 创建的链接的文件。 备份是 当所有者的 gpg 下一次更新时, 将替换旧的 root 自有运行 键盘.

## 如何建造它

`packages/wasix-gnupg/build.sh` 在家庭圈; 补丁和上游 油球校验和 `patches/` 财务报告和审定财务报表 `SOURCES.md`。 。 。 .

-   子孙是 `posix_spawn` (无分叉); `gpg-agent --daemon` 分解为 重新开始.
-   由相机所建,以相机为主,与Isix-sysroot 2025.9.30-43(自2.4.9-17起;2.4.9-10至-16用-34起;2.4.9-7至-9-31/-32起;2.4.9-6-28起;前作-20起)相接,有64个MiB初始内存(recipe. 雅姆尔 `wasm`: 信号 口罩是塑胶内核的 (≥ 1.88.0),所以gpg-agent的 `npth_pselect` 联合国 信号口罩在解剖上等待并唤醒:SIGHUP重读配置 并冲出已设置的缓存, SIGTERM 关闭代理( 它删除其 插座和出口,SIGINT立刻关闭. 用户代号来自slic-内核 流程证书,在页码内核上, 1.47.1 文件的拥有者是 调用者的ID, 所以每个用户自己的主目录都会通过 GnuPG 的所有权检查 (它拒绝它不拥有的家园) 需要slic-内核 ^ 1.47.1.

许可证:GPL-3.0-或-后期(GnuPG);图书馆许可证在 `licenses/`。 。 。 .

## 常见问题

### @ai-ecoverse/wasix-gnupg 是什么？

GnuPG 2\.4:OpenPGP加密并用gpg,gpgv和gpg-agent签名\.

### 如何安装 @ai-ecoverse/wasix-gnupg？

在项目目录运行 npm install @ai-ecoverse/wasix-gnupg，或使用 pnpm add / yarn add / bun add。

### @ai-ecoverse/wasix-gnupg 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/ai-ecoverse\_\_wasix-gnupg 是否存在。

### @ai-ecoverse/wasix-gnupg 可以商用吗？

@ai-ecoverse/wasix-gnupg 使用 GPL-3\.0-or-later 许可。强 Copyleft：分发包含该代码的软件时，整个作品需以 GPL-3\.0 兼容许可开源，并附带专利与反锁定条款。仅内部使用不触发此义务。以上为概括，不构成法律意见，请以许可原文为准。

### @ai-ecoverse/wasix-gnupg 的下载量有多少？

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

### @ai-ecoverse/wasix-gnupg 还在维护吗？

最新版本 2\.4\.9-17 发布于 2026/10/26（12 天前）；至今共发布 16 个版本，其中过去 12 个月发布了 16 个；首次发布于 2026/10/03。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

