原型 · 预览版:收录官方注册中心里的全部服务器,每 30 分钟同步一次。评价和账户功能将在后续阶段推出。
PopNx MCP为使用 AI 的人准备的 MCP 服务器 · 用大白话讲清楚

Signoff Cli

作者:ayuanxx-max版本 4.1.9i★ –i在你的电脑上运行
注册名称io.github.ayuanxx-max/signoff-cli

安装

概览

作者提供的说明(英文原文)

Five gates that make an agent's 'done' provable: run them, read the verdict, audit the record.

PopNx MCP 的三大支柱

这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。

它能帮你做什么

我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。

  • 连接方式: 在你的电脑上运行
  • 传输方式: stdio
  • 分类: 开发者工具

安装

选择你使用的 AI 应用,然后复制设置。

安装之前

  • 基础检查:1 项中通过 1 项
  • 在你的电脑上运行,拥有你的用户账户的权限(文件、网络、应用)。
  • 注册中心没有列出需要填写的密钥。

你需要

  • npm已安装 Node.js(用于 npx 命令)

你用的是哪个应用?

在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。

打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json

{
  "mcpServers": {
    "signoff-cli": {
      "command": "npx",
      "args": [
        "-y",
        "signoff-cli",
        "mcp"
      ]
    }
  }
}

在终端中运行这条命令

claude mcp add signoff-cli -- npx -y signoff-cli mcp

在 Cursor 中打开

或者自己复制设置

粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json

{
  "mcpServers": {
    "signoff-cli": {
      "command": "npx",
      "args": [
        "-y",
        "signoff-cli",
        "mcp"
      ]
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

在 VS Code 中打开

或者自己复制设置

粘贴到项目中的 .vscode/mcp.json

{
  "servers": {
    "signoff-cli": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "signoff-cli",
        "mcp"
      ]
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。

你的选择通过 Cookie 保存在这台设备上,无需账户。

这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。

它能做什么

它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。

基础检查i

我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月8日

  • ✓ 通过

    作者与仓库一致

    注册名称已通过 GitHub 账户 ayuanxx-max 验证,该账户拥有此仓库

  • … 尚未检查

    仍在维护

    我们还没有从 GitHub 读取这个仓库

  • … 尚未检查

    有许可证

    我们还没有从 GitHub 读取这个仓库

  • – 不适用

    端点有响应

    它在你的电脑上运行,没有互联网端点

  • – 不适用

    使用 OAuth 登录

    在你的电脑上运行,改用本地设置

  • … 尚未检查

    工具描述中没有隐藏指令

    它在你的电脑上运行;我们只能读取互联网端点的工具列表

与“开发者工具”中的其他服务器比较i

  • 星标数多于此分类中其他 4909 个服务器的 0%
  • 发布到注册中心的时间比此分类中其他 4909 个服务器的 99% 更新
  • 基础检查结果等于或优于此分类中其他 4909 个服务器的 100%

与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。

常见问题

Signoff Cli 安全吗?

它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。

它需要哪些密钥或代码?

注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。

它在我的电脑上运行还是在云端?

它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。

它还在维护吗?

GitHub 仓库最后更新于–,最新版本(4.1.9)于今天进入注册中心。

哪些应用可以使用它?

支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。

有什么可以替代它?

同一分类中有:GitHub, Desktop Commander, Cloudflare MCP

替代选择

同一分类中其他作者的服务器,按星标数排序。

如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i

GitHub

作者:github

Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.

电脑或云端★ 34,245MIT4天前更新
安装

Desktop Commander

作者:wonderwhy-er

MCP server for terminal commands, file operations, and process management

在你的电脑上运行★ 10,225MIT16天前更新
安装

Cloudflare MCP

作者:cloudflare

Cloudflare MCP servers

在云端运行★ 4,446Apache-2.014个月前更新
安装

作者的 README

打开 README

按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。

落印 / SignOff

包名 4.0.0 起为 `signoff-cli`(曾用名 dsh-signoff,旧包已标记 deprecated)。

命令仍是 signoff;仓库地址仍是 ayuanxx-max/signoff-cli。DSH 只是它最早的使用场景,

任意 git 仓库、任意语言都可以直接用。

中文名「落印」:印落纸面才算数,对应英文名 SignOff。曾用名「一诺过五关」「执印」。命令是 signoff;

包名 4.0.0 起为 signoff-cli,仓库 4.1.0 起为 ayuanxx-max/signoff-cli(由 dsh-signoff 改名,老地址 301)。

签下的那句“做完了”,得自己走过五道关才算数。

五道关卡,五条命令,退出码即判决;发版另加第六道 signoff release(见文末)。每一关都对应 agent 交付时的一种失败方式:靠记忆跑测试、把“有开发页”当验证、多个 agent 撞同一文件、危险动作做过就忘、文档里塞空话。SignOff 把这五种失败变成五个可执行的检查。

npm i -g signoff-cli      # 或 npx signoff-cli

signoff p1 # 一关一关过 signoff all # p1 + p2 + p5 + p4 verify

关命令判决什么
P1 验证signoff p1检查是否真的跑过、跑在预算内、用例数多少
P2 覆盖signoff p2验证到了哪一级:scenario / harness / smoke / missing
P3 队列`signoff p3 validate\plan\collect`卡片是否齐、并发是否撞、谁越界谁没交
P4 账本`signoff p4 ask\confirm\verify\export`危险动作有没有票、回滚点是否还在
自查signoff doctor [--json]为什么没按预期生效:钩子、PATH、版本、安装点、账本、装钩子之后的缺失提交
P5 反空话signoff p5文档里有没有空话、绝对化断言、无数字的已验证

一张图看懂

六个层次从左到右:入口(CLI / git 钩子 / CI / Agent 面)都走同一个 guard.js;调度决定跑哪几关、 谁算通过;五关每关都写清“读什么、判什么、怎么修”;状态机说明一次提交里 marker 与 trailer 是怎么产生的; 产物是判断留下的证据;最右是外部依赖——只有 Node ≥18 与 git 是硬要求,其余都可缺。 判定没有“部分通过”:退出码 0 通过、1 任一关判红、2 用法或环境错。

上半部分按 0→5 的先后排:前置检查 → 安装 → 初始化 → 日常提交 → 红了怎么办 → 升级与卸载。 红框是必做,黄框是最容易踩的坑(--chain、--lock-test、npm proxy)。 下半部分三块是“不改你的流程、但会改变你看到的现象”:平台差异、环境差异,以及三条红线 (--no-verify、SIGNOFF_SKIP=1、调阈值让红变绿)。

两张图都由 Mermaid 生成,源文件在 docs/diagrams/src/,改文案重渲一次即可, 不用重画。

零接触:装一次,之后不用管

目标是一条命令之后不再需要任何操作:npm i -g signoff-cli 装完即生效,之后每次 git commit 都自动受五关约束。

层什么时候发生覆盖范围
机器层npm i -g 的 postinstall 写 core.hooksPath → ~/.signoff/hooks本机所有仓库,新克隆的也算
仓库层postinstall(在某个仓库里执行时)或 signoff ensure该仓库的 .git/hooks、.signoff/config.json、CI workflow、ledger
仓库声明仓库根提交了 signoff.json(signoff init --share 生成)任何克隆:机器层见到声明就自动装全五关,克隆方零操作
关内每次 commit已 opt-in 的仓库跑 P1–P5;未 opt-in 的仓库只跑 P1(测试必须过),不写任何状态
npm i -g signoff-cli      # 一次;postinstall 自动装好机器层 + 当前仓库

signoff ensure # 换个仓库想把五关都装上,跑这一条(幂等) signoff ensure --global # 只重装/修复机器层 signoff ensure --json # 给脚本看的结构化结果

npm 11 会把 postinstall 放进 allowlist 提示,可能不执行——所以还有一层兜底:在该仓库里第一次跑任何一关(比如 signoff p5 README.md)会自动把五关装好。 要放行安装脚本就加 npm i -g signoff-cli --allow-scripts=signoff-cli。

行为约定:

  • 已 opt-in(有 .signoff/config.json):pre-commit 跑全套五关,PASS 才写 marker 和 trailer。
  • 未 opt-in:只跑 P1(有测试才跑,没测试就明说"没检测到测试运行器"后放行),不写 .signoff 配置、不带 trailer。
  • 仓库自带的钩子不会被绕过:机器层先执行 .git/hooks/ ,它若是 signoff 的钩子就直接以它的判决为准。
  • 提交 signoff.json 等于「这个仓库同意 P1–P5」:.signoff/ 是 gitignore 的,声明文件进 git, 所以别人克隆下来第一次 commit 就会把 hooks / config / CI 自己补上。字段见 docs/signoff.schema.json。
  • 临时退出:SIGNOFF_NO_BOOTSTRAP=1(不做自动安装)、SIGNOFF_NO_MACHINE=1(不跑机器层的轻量关)。
  • 撤销机器层:signoff uninstall --global。

一、案例:本次 DSH 2.0.22-next升级后在修复(dsh-session-fork-tree 0.9.34)bug里,五关各自做了什么?

这次修的是“升级 DSH 后,点侧栏「···」菜单,菜单闪一下就消失”。五关实际起了什么作用,逐条列出,包括没发挥作用的那一关。

关本轮实际动作证据判定
P1手动跑 precommit.ps1;闸门第 10 层 pytestPASS 3666 ms(101 用例);第 10 层 3438 ms护栏有效;但它只跑工具自身的 Python 用例,抓不到这次的前端问题,也没能自动拦提交(插件目录是独立 git 仓库、没装钩子)
P2三套真实 DOM 场景:menu(11) / arrange(13) / perf(6);并把该包纳入覆盖率账本coverage.py:apps 4→5,scenario 5/5,断言 36→77主力。决定“修好没有”的是场景断言,不是肉眼;账本让这些断言不再是一次性证据
P3未使用:没写任务卡,没跑 fanout.py无 card.json、无 wave 记录未发挥。三件事有依赖顺序(修→测→说明引用实测数字),但这不等于可以不写卡留痕
P4事后审计抓到我自己填的假回滚点;补录发布记录verify 先 FAIL:rollback point 'npm deprecate …' not a git ref;修复后 {"ok": true, "entries": 4, "problems": []}事后有效,事前缺位。npm publish、GitHub Release、改 profile 都是先做后记,没走取票
P5三份新文档过 slop 六规则;覆盖率表由工具重生成slop {"ok": true, "files": 3, "hits": []}有效;但把包登记进覆盖率是发布之后补的,说明里那组断言数当时还没进账本

一句话:P2 决定“修好没有”,P5 决定“我有没有说大话”,P1 只证明没弄坏别处,P4 事后抓住了我自己的一笔脏账,P3 全程没上场。 这个结论本身就是 SignOff 想要的输出:每一关都要能回答“发挥了没有”,不能只说“流程走过了”。

你不需要做什么,照常进行任务,由它来守护这个过程;

二、自动守护:装一次,之后不用记

signoff init 把五关接进 git 与 CI,一次安装,之后正常 git commit / git push / 开 PR 都由它先查:

安装物作用
.git/hooks/pre-commit暂存区一变就跑闸门:文档改动 → P5;能探到测试命令 → P1;有 verify/scenarios/ → P2 --strict;有账本 → P4 verify。红了直接拒绝提交
.git/hooks/pre-pushpush 前跑同一套(--full,不吃缓存)
.git/hooks/commit-msg把 Signoff-Pass: (跳过时 Signoff-Skip:)写进提交信息;signoff audit 与 CI 据此判断这次提交真的过过闸门
.github/workflows/signoff.yml每个 push / PR 跑 npx signoff-cli guard --ci,绕不过去
.signoff/config.json测试命令、预算、文档目录;signoff status 随时查看
.gitignore追加 .signoff/,结果不进版本库

只依赖 Node 18+:闸门本身是 Node 实现(lib/p*.js),没有 Python 也能跑完整五关,不存在降级模式。

三条稳定性措施:同一份暂存内容只判一次(命中缓存约 0 ms,反复 git commit --amend 不重复付时间);失败只打印失败那一关的尾部(完整日志在 .signoff/hook.log);超预算直接判红(默认 180 秒,--budget 可改)。

绕过的路仍然有,但不再无痕:signoff audit --range origin/main..HEAD 逐个提交核对标记与提交树——缺失就是绕过(git commit --no-verify),判红;SIGNOFF_SKIP=1 的提交写成 Signoff-Skip: 并记进 .signoff/skips.log,--strict 下同样判红。生成的 CI 里已经带这一步。

队友为什么也会被守住:先把 signoff-cli 放进 devDependencies(npm i -D signoff-cli),再 signoff init --prepare,它会把 signoff init --quiet 并进 package.json 的 prepare,队友 npm install 完钩子就有了。没这个依赖时 --prepare 会拒绝写入并提示——否则 npm install 会因为找不到 CLI 直接失败。

signoff init                 # 装钩子 + CI + 配置

signoff init --chain # 已有钩子保留:存为 .local,先跑它 signoff init --prepare # 同时写进 package.json,队友 npm install 即装钩子 signoff status # 这个仓库现在守不守? signoff doctor # 为什么没按预期生效(只读) signoff doctor --fix # 让它把能证明的修掉:重装缺失钩子、补执行位、清掉没暂存的标记 signoff guard --full # 手动跑同一套(钩子调的就是它) signoff audit --range origin/main..HEAD # 这些提交真过过闸门吗? signoff audit --since-install # 只看装钩子之后的提交(安装点不在 HEAD 祖先里会直接拒绝) signoff init --reset-install # 历史被改写或换了克隆后,把安装点挪到当前 HEAD signoff init --lock-test # 把识别到的测试命令写进配置,换机器不再漂移 signoff uninstall --all # 卸掉钩子 + CI + 配置 signoff uninstall --keep-config # 卸掉钩子 + CI + 运行时状态,保留配置与账本 signoff p4 export --merge ../other/.signoff/audit.log # 多仓库合并成一张表 signoff p4 export --format json --out ledger.json # 也可以导出 json / csv signoff explain p2 # 这一关到底查什么、怎么判的 signoff secrets # 只扫暂存区的密钥泄露(钩子里自动先跑) signoff secrets --all --json # 全仓库扫一遍,一条 JSON 判决

密钥扫描与提速(3.12.0 起)
  • P1 之前先扫密钥:内置 16 条高信号规则(AWS / GitHub / GitLab / OpenAI / Google / Slack / Stripe / npm / SendGrid / 私钥块 / Azure / Discord webhook / 带密码的数据库 URL / 通用凭证)。 命中即失败;装了 gitleaks 可用 --engine gitleaks 换全套规则,没装也不影响(纯 Node,无需二进制)。
  • 值不会原样打印:只显示 AKIA…EF 这种前缀 + 规则名 + 行号,避免把日志变成二次泄露。放行写在 .signoff/config.json 的 secrets.allow。
  • 未 opt-in 的仓库也扫:机器层守护走 --no-state,扫完不留任何文件。
  • 运行器探测扩了 9 种:go / cargo / maven / gradle / dotnet / ruby / elixir / php / make(tests/ 与 package.json 仍在最前)。
  • 同一暂存树结果缓存:重复跑 0 ms;纯文档提交跳过测试。两个开关都可关:SIGNOFF_NO_CACHE=1 / SIGNOFF_NO_FAST=1。
签名与增量覆盖率(3.13.0 起)
  • 提交自带签名:signoff init --sign 生成仓库本地 ed25519 密钥,commit-msg 在 Signoff-Pass: 之外再写 Signoff-Key: + Signoff-Sig:(对完整 tree 签名,单行 base64)。没有密钥就只写未签名的 Signoff-Pass,不阻塞提交。
  • 可以复核:signoff audit --verify 逐个提交验签,--require-signed 把未签名也算失败。身份锚点是 仓库里提交的 .signoff/allowed_signers(或 signoff.json 的 allowed_signers):不在名单里只报 self-signed,绝不报 verified。
  • 增量行覆盖率:signoff cov --diff --min 80 只算这次改动新增的行,读项目已有的 coverage/lcov.info / coverage-final.json / python coverage json,不额外装运行器;没有覆盖率文件时报"没测过",不会假装通过。
  • CI 直接标到行:GITHUB_ACTIONS=true 时,密钥/覆盖率发现输出 ::error file=…,line=… 注解并写步骤摘要, PR 页面直接看到,不用翻日志。
可核对的凭证(3.15.0 起)

signoff p4 checkpoint 给账本签一个检查点,signoff p4 anchor 打出一行可以贴到发版说明里的锚点:

signoff1:12:9f2c1ab34d0e:71b0c9d2e4a85f61

事后 signoff p4 verify --checkpoint --anchor <那一行> 能分辨四种情况:账本被截断、内容被改、 签名不属于受信 key、锚点与本机不一致。细节与边界(它不证明什么)见 docs/trust.md。

3.15.2 起还补了三件事:signoff p4 path 打印账本与检查点的真实位置(脚本不用猜); guard 通过后自动续签检查点(同一份账本不重复签,不产生无意义改动);账本读取容忍 BOM (Windows 编辑器与 Set-Content -Encoding utf8 的常见产物)。

能力矩阵与匿名竞品(3.15.2)

同一张表看"谁有什么"。竞品按类型匿名(不点名,避免把对比写成广告),对应关系与星标/下载数据 记录在 docs/signoff-positioning-3.15.2.md。

能力落印竞品A 平台级竞品B 钩子框架竞品C 密钥扫描竞品D 文本规则竞品E 供应链证明竞品F 覆盖率
测试真的跑过(预算 + 用例数)有有无(只负责触发)无无无无
增量覆盖率分级有有无无无无有
密钥扫描有有无有无无无
中文文档空话规则有无无无部分(英文词表)无无
可验签的判决(trailer + key)有部分(服务端签名)无无无有(attestation)无
离线账本 + 截断检测有无无无无部分(需 layout/验证器)无
可发布锚点(一行贴进发版说明)有无无无无无无
零配置两步上手有无(要服务端 + 项目配置)部分(需已有 Node/Python 项目)有有无(要密钥与 layout)有
托管看板 / PR 状态回写无有无无无无无

结论放在表后面而不是前面:前七行是它和其他工具的分野,最后两行是它的短板——托管面没有, 生态采用量也还没起来(1 star、周下载三位数),所以六维里"生态"给 3 分,不是 5 分。

上图是一次提交的完整路径:入口(git commit / 命令 / CI)→ 三层零接触 → guard 固定顺序跑 secrets → p5 → p1 → p2 → p4 → cov(opt-in)→ 判决 → 四层证据(marker → trailer → 账本 → 检查点 → 锚点)。红一关即停,退出码就是判决。

上图横轴是生态采用度,纵轴是覆盖广度。落印落在左上角——功能全、采用低,这是它的真实位置: 它不在右上角跟平台级产品比采用,差异在"判决可以带走、可以事后核对"。

规则包、预设与编辑器(3.14.0 起)
  • P5 规则包:--pack zh|en|both。中文词表是默认值,行为不变;en 用词边界匹配 (very 不会命中 delivery),both 两套一起跑并按行去重。--rules rules.json 追加自定义词表 (ai_words / absolute / adverbs / claims / placeholder),也可写进 .signoff/config.json 的 p5 或 signoff.json 的 p5。
  • 场景预设:signoff init --preset node|python|go|java,一次给出预算、文档目录、覆盖率阈值和规则包; test_cmd 仍交给自动探测,克隆到没有该脚本的机器也不会锁死。
  • VS Code:signoff init --editor vscode 写 .vscode/tasks.json(guard / all / secrets / cov / audit / status) 与 problem matcher,失败直接落到 Problems 面板;已存在的任务只合并不覆盖。

三、在其它代码过程里能干什么

场景五关怎么用
新功能P3 先写卡(目标 / scope / 验收 / 回滚)→ P1 让检查命令化并进钩子 → P2 把验收写成场景断言 → P4 发版取票 → P5 文档只留能被数字支撑的句子
修 bugP1 把复现命令固化(--run 可重复)→ P2 加一条“反向断言”(旧写法必须红)→ P3 多人并行时按 scope 分波 → P4 单点回滚 → P5 说明里每个数字能落到事实表
重构P3 的 scope 锁死可动范围,collect 抓越界改动;P2 用零写入 / DOM 恒等这类断言证明“行为没变”
CI 流水线signoff all 一条命令,退出码直接当 CI 判决;P1 的预算参数防止测试变慢却没人发现
多 agent 并行P3 plan 输出 wave(scope 相交的卡绝不同波),collect 抓“改了不该改的文件”和“交了空活”的卡
交接与复盘P2 的覆盖表 + P4 export 出的账本,接手的人先看这两张表,再看代码
合规留痕P4 哈希链:改过的记录会被 verify 判为 content hash mismatch,事后补账能被发现

四、在 DSH 任务里能干什么

  • 发 npm / 改 profile / 改 cordis 配置:P4 先 ask 取票(单次、10 分钟过期、绑定动作类别),再 confirm 落账,账里带回滚点;回滚点必须是真的 git ref,写一句“npm deprecate …”会被 verify 拒绝。
  • 插件发版:P1 跑三套真实 DOM fixture,P2 把结果记进覆盖率表,P5 保证发布说明里没有绝对化的收尾句。
  • 长任务 / 跨天任务:P3 的卡片就是断点续传的凭据——scope、验收、回滚点三样齐了,换会话也能接上。
  • 多分叉并行:不同分叉各拿一张卡,plan 先算出不会撞文件的波次,避免两个 agent 同时改同一处。
  • 收尾:P5 的六条规则让“完成”这句话可以被机器反驳:无数字的已验证、TODO、绝对化断言、AI 味词表(赋能 / 闭环 / 抓手…),命中即失败。
  • 插件回归:verify/scenarios/*.json 是 P2 的输入格式,把 fixture 的 checks 数量直接变成覆盖率数字,不需要另写报表。

五、命令速查

# 自动守护:装一次,之后不用记

signoff init signoff status signoff guard --full signoff uninstall --all

P1:跑检查;默认 tests/ 用 pytest,否则 npm test

signoff p1 --run "pytest -q" --run "npm run lint" --budget 120 signoff p1 --install-hook # 写入 .git/hooks/pre-commit

P2:覆盖分级 + 阈值

signoff p2 --strict --min-scenario 4 --min-assertions 60 --md docs/coverage.md

P3:卡片校验 / 波次规划 / 收集核对

signoff p3 validate --

只显示了开头部分;其余内容请在仓库中阅读

问 PopNx