详情

首页手游攻略 omit:AI Agent 工具实践指南

omit:AI Agent 工具实践指南

佚名 2026-10-07 10:30:02

实际评估omit时,我先确认它解决的具体问题:省略不必要的代码, AI 编码代理的编辑纪律:少草稿,引用所有内容,最后删除。团队若要把它用于内容与市场工作,应先处理受众、平台规则和事实依据容易被统一模板抹平,否则试用结果很容易失真。短测时我会选一个已有主题制作可人工复核的样稿,并保留事实准确性、平台适配、语气和修改成本的结果,方便团队复盘。对有明确品牌标准并保留人工审校的团队来说,这个仓库值得继续验证;只求即装即用的人则要先看维护成本。

sriinnu/omit 项目截图 1

省略

省略不必要的代码。

AI 编码代理的编辑规则。以 Strunk & White 的规则 17 命名:“省略不必要的单词”:适用于代理编写软件的方式:它们覆盖(膨胀)和过度声明(幻觉的快捷方式)。 omit 修复了这两个问题。

草稿少一点。引用一切。最后切掉。

问题

AI 特工是多产的作者和糟糕的编辑。他们添加没人要求的抽象,引入三行逻辑的依赖关系,并且:当被告知“保持简单”时:自信地获取不存在的 stdlib APIs。仅限极简主义的规则集解决了臃肿的问题,并使过度的要求“变得更糟”:减少奖励的压力,发明了捷径。

系统

omit 将代理从作者变成编辑。四个部分:

部分 它的作用
七个遗漏 在编写任何内容之前,请尝试七种“不”编写的方法:省略功能、新代码、自定义、脚本、依赖项、仪式:在第一个省略处停止。编辑后幸存下来的,就是船舶。
事实核查 没有引用就没有遗漏 该工具可以重新检查自身:file:line:symbol 表示“代码库有这个”,可执行片段表示“stdlib 覆盖它”,声明的 dep + 片段表示“dep 处理它”。只有作者可以阅读的引文是自我报告,而幻觉的捷径是捏造的引文。
最终草案 工作代码是初稿。测试变绿后,对代理自己的差异进行一次无情的编辑:然后是一份网络报告:文件、±行、新的 deps(目标:0)。完成意味着最终草案,而不是绿色测试。
承重线 编辑可以减少脂肪,而不是墙壁。验证、错误处理、安全性、可访问性、并发正确性和显式请求永远不会被削减:并且添加它们是宣布的,永远不会走私或跳过。

故意的遗漏会作为脚注记录在代码中:

// omitted: retries: single caller tolerates failure; add backoff if this goes multi-tenant

执行:要求与强制

这种类型中的所有其他技能都是代理在上下文压力下可以忽略的词语。省略在模型外部运行的船舶机制:

机制 它的作用
命令哨兵(钩子) 检查它运行的每个 shell 命令 BEFORE 并阻止经典代理灾难:rm -rf ~、system/drive 根的递归删除、通过未设置变量删除(rm -rf $OUT/* 和 $OUT 为空)、要阻止的 dd装置,mkfs,叉子炸弹。用户的机器是承重的。放弃一个需要一个带有真实原因的尾随评论——# omit-allow: <reason>。裸标记、字符串文字内的标记和无原因标记将被忽略。
哨兵(钩子) 新的依赖项命中清单,但 .omit/receipts.jsonl 中没有“已验证”收据 → 编辑当场遭到反对。收据必须列出已尝试过的遗漏,并重新检查每一项:如果确实存在遗漏,则收据将被驳回,依赖性将被拒绝。
危险哨兵(挂钩) 硬编码的 API keys/secrets 和易于注入的模式(字符串构建的 SQL、eval、shell 连接、innerHTML、不安全的反序列化)在进入文件时立即被阻止。 秘密没有覆盖 - 秘密规则在咨询任何标记之前运行,因此没有 omit-allow: 放弃一个。注入行采用带有真正原因的尾随注释,并且只有这种形式。
泄漏哨兵(钩子) 阻止在运行之前将“现有”秘密的原始值打印到标准输出的 shell 命令,或直接在命令行中输入实时密钥:macOS 钥匙串、Linux secret-tool/pass/gpg -d、1Password/Vault/AWS/GCP/Azure/kubectl 秘密 CLIs、裸 env/printenv、env | grep-ing a KEY/TOKEN/SECRET/connection-string var, or cat-ing a .env/credentials/*.pem/id_rsa file. Redirecting to a real file or piping into a non-printing sink (clipboard, --password-stdin) is recognized as safe — the goal is keeping secrets out of the transcript, not off disk. Adversarially reviewed (3 lenses, every finding re-verified by execution, not inspection) before shipping — one known gap stays undetected on purpose rather than chasing a fragile fix: a for/do/done > file 循环的尾随重定向不会归因于循环体。代理人自己的笔录并不是存放真正密钥的安全地方。
皮棉哨兵(钩子) 省略船舶无棉绒规则。它检测存储库已配置的 linter(eslint、biome、ruff、flake8),并在每个编辑的文件上运行它,因此代理会立即听到反对意见,而不是在 CI 时间。已配置但无法运行的 linter — 没有 node_modules,PATH 上没有任何内容 — 被报告为“未运行”,并给出原因,永远不会通过; “未配置 linter”现在保留给真正没有 linter 的存储库。
最终草案门(钩) 会话不能以已编辑的树和当前没有 .omit/final-draft.md 网络报告的方式结束 - 并且该报告将被读取,而不仅仅是统计。其 files/lines/deps 计数与实际差异进行交叉检查,因此存根或过时的草稿不会通过。删除通道是一个门,而不是一个建议。
收据分类账 每个事实检查引用都作为索赔附加到 .omit/receipts.jsonl 加上解决问题的证据,并且 omit verify 重新检查批次。在 PR 上运行它:“17/17 声称幸存”是审阅者可以采取行动的数字,“3 驳斥”准确地命名了发明的快捷方式。

Hooks 使用 Claude Code 插件自动安装。 Codex CLI 有自己的相同形状的钩子系统(PreToolUse 在 Bash 中使用 tool_input.command 触发,退出 2 个块)——运行 npx @sriinnu/omit hook install codex 来写入 .codex/hooks.json。命令和泄漏哨兵根据 Codex 记录的模式和有效负载形状进行验证(尚未有实时 Codex 会话端到端地触发它们);基于文件的哨兵 (dep/hazard/lint) 和 Final Draft 门也已连接,但已尽最大努力,因为 Codex 的 apply_patch 输入形状尚未验证。人类逃生舱口:OMIT_OFF=1。

这没有抓住什么

一张机制表邀请您阅读它作为保证。这不是其中之一,所以这是其余的。下面的每一项都是已知的、重复的限制,而不是假设。

  • 无法从命令中读取路径的写入未到达文件哨兵。 python -c "open('f','w').write(...)"、curl -o f、node -e fs.writeFileSync。此类命令中的字面秘密仍然可以通过命令文本扫描捕获;它的“注入”模式不是。对于通过未连接哨兵的工具重写的文件也是如此。
  • omit gate 是一个 git hook。 git commit --no-verify 跳过它,而 core.hooksPath 完全隐藏它 - omit audit 和 omit gate 都在判决中报告这一点,而 omit hook install 写入 git 实际运行的目录挂钩,但没有什么可以阻止您绕过自己的预提交挂钩。
  • 依赖项白名单很短。 setup.py、build.gradle、Package.swift 和 *.csproj 是依赖项形状且未解析。它们现在被“报告”(unparsed deps: …)而不是算作零,并且更改后的值会抑制 deps 行上的 ✅ - 但门不会对它们失败,因为存储库中的 setup.py 并不是任何证据。
  • lint 哨兵在会话中运行 linter,它执行您的 lint 配置 - 与您自己运行 npm run lint 具有相同的信任。在 GitHub 操作中,它是门控的:使用默认的 exec: false,CI 根本不运行 linter,并且判决显示“不运行”而不是声称通过。
  • 收据证据与其声明文本绑定。 run 片段必须命名其所执行的内容,并且 argv 必须提及它,这会关闭按需退出的片段(["true"]、["false"])。它不会捕获命名符号而不调用它的代码片段。证明这一点意味着验证者编写代码片段,然后测试验证者。
  • omit 自己的目录不受危险扫描的影响,因为账本通过构造保存了证据字符串。它的执行风险是OMIT_HOOK_EXEC所控制的。
  • 该操作不会运行 PR 的收据,除非您设置 with: { exec: true }。 PR 的 run 片段是不受信任的代码,因此默认情况下不执行它们。

// omitted: a mechanism for the first item above 将是一个 shell 解析器,错误的 shell 解析器比没有更糟糕。它是故意遗漏的。

收据:主张和证据,一条线

极简主义是一种品味,而品味是没有收据的。它下面的故障模式确实如此:代理说“代码库已经做到了这一点”或“stdlib 涵盖了它”,并且没有人检查。这种类型的每个规则文件都告诉代理不要撒谎。 omit 检查。

每项索赔均以 .omit/receipts.jsonl 形式提交,并附有解决该索赔的证据:

{"claim":"reuse","rung":2,"file":"src/util.ts","line":42,"symbol":"parseRange"}
{"claim":"stdlib","rung":3,"api":"crypto.randomUUID","run":["node","-e","crypto.randomUUID()"]}
{"claim":"installed-dep","rung":5,"dep":"zod","run":["node","-e","require('zod').object"]}
{"claim":"new-dep","rung":7,"dep":"left-pad","tried":[{"rung":2,"absent":"padTo"}]}
$ npx @sriinnu/omit verify
✅ line   1  verified      reuse
⛔ line   2  failed        new-dep
        [new-dep] tried[0] (rung 2) actually HOLDS: padTo is present at src/util.ts — so the omission applies and this dep is not needed

1/2 claims survived re-checking · 1 refuted · 0 unverifiable

第二个就是整个想法。一张 new-dep 收据上写着“我尝试了之前的遗漏,但没有一个被保存”——因此它引用了它所寻找的符号,omit 在树中搜索自己,并且存在的符号反驳了代理自己的结论。当作者提供问题而不是证据时,你就不可能引用你从未尝试过的遗漏。

有两个装订可以固定,但都不是装饰性的:

  • run 必须命名它所执行的内容(api 或依赖项),并且 argv 必须提及它。退出状态本身并不能证明什么:["true"] 退出 0,["false"] 退出 1,同时既不测试标准库也不测试其他任何东西。按需存在的片段不是证据。
  • tried 条目引用了一次搜索,而不是一个位置。 命名一个根本不存在的文件并不能证明什么——它曾经是伪造“我尝试重用”的最便宜的方法,因为检查只询问它是否失败。

run 是一个 argv 数组,而不是 shell 字符串:参数中不会扩展,也不会隐藏任何内容。 .omit/receipts.jsonl 的可执行性与 Makefile 的含义相同——以 PR 的方式读取它。 OMIT_NO_EXEC=1 将这些检查降级为“不可验证”而不是执行它们,并且依赖项挂钩根本不会执行它们,除非您设置 OMIT_HOOK_EXEC=1:否则分类帐的 Write 会像您一样运行代码,而不会出现批准提示。

从 0.3.x 升级: 上面的形状是 0.4.0 模式。写在它之前的收据——散文 receipt 字符串,或引用文件的 tried 条目——读作 unverifiable,omit verify 单独命名。它们不会被默默地接受,也不会被默默地抛弃。

任何提供商,相同的登机口

执行逻辑存在于零依赖性 CLI 中,而不是存在于任何一个供应商的钩子系统中:Claude Code 和 Codex 的钩子都只是其上的瘦适配器。对于 Cursor、Copilot 或其他任何东西,在每个代理经过的两个阻塞点强制执行:

npx @sriinnu/omit hook install   # git pre-commit: audits the staged diff,
                                 # fails on secrets, injections, uncited deps
npx @sriinnu/omit 审核 # 净差异(包括未跟踪的文件)、新部门、危险
npx @sriinnu/omit check <files> # 危险扫描特定文件(连接到任何钩子系统)
npx @sriinnu/omit lint [files]   # run the repo's OWN linter on changed files
npx @sriinnu/omit verify # 重新检查 .omit/receipts.jsonl 中的每个声明
npx @sriinnu/omit Guard "<cmd>" # 这个 shell 命令是灾难吗? (连接到任何挂钩系统)
npx @sriinnu/omit Leak "<cmd>" # 这个命令会打印一个真正的秘密到标准输出吗?
npx @sriinnu/omit gate           # the pre-commit check, callable from anywhere
npx @sriinnu/omit hook install codex # write .codex/hooks.json — Codex CLI 内的实时哨兵

在服务器端,GitHub 操作对每个 PR 的判决进行评论,无论代码是由什么编写的:

# .github/workflows/omit.yml
on: pull_request
permissions: { contents: read, pull-requests: write }
jobs:
  omit:
    runs-on: ubuntu-latest
    # A fork's PR gets a read-only token, so the comment could only fail there.
    if: github.event.pull_request.head.repo.full_name == github.repository
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - uses: sriinnu/[email protected]
        # with: { exec: true }   # execute receipts' `run` snippets to verify them
                                 # fully. Off by default: a PR's receipts are
                                 # untrusted code, and this runs on pull requests.
### omit verdict
- net: +61 −204 lines across 4 files
- new deps: 0 ✅
- hazards: 0 ✅
- 脚注:3记录·承重:1标记
- receipts: 17/17 verified
- lint: eslint ✅
// omitted: a composite "omit score": any weight vector over these counts is
// 发明了,脚注可以通过添加行来提高它。上面的计数是
// the receipts; a single number would just be another uncited claim.

裁判(实验)

bench/ 是 METHODOLOGY.md 可运行的:在基线下配对代理运行相同的任务,省略或任何竞争技能,根据实际 git diff 计算的指标,保留所有记录。该类别争论的是自我报告的数字;省略运送测量仪器。参见 bench/README.md。

模式

模式 行为
margin 按要求构建;在页边空白处注明可以省略的内容
redline 默认。 全面执行:七项遗漏、事实核查、最终草案
rewrite 在构建之前还要质疑作业本身
off 禁用直到重新调用

在聊天中说 omit redline (或任何模式),或者在支持斜杠命令的情况下使用 /omit <mode>。

安装

新来的? GETTING-STARTED.md 为每个代理提供复制粘贴设置。

Claude Code(插件市场):一对命令,让您获得技能加上 /omit 和 /omit-edit:

/plugin marketplace add sriinnu/omit
/plugin install omit@omit

任何 SKILL.md-aware 代理(Claude Code、Codex、Cursor 等,通过 skills.sh):

npx skills add sriinnu/omit

全局命令:从GitHub安装一次,到处使用:

npm install -g github:sriinnu/omit
omit init cursor        # or: omit audit / omit gate / omit hook install

npm / npx:将正确的规则文件放入当前存储库(永远不会覆盖现有文件):

npx @sriinnu/omit init            # AGENTS.md (default)
npx @sriinnu/omit init claude     # .claude/skills/omit/SKILL.md
npx @sriinnu/omit init cursor     # .cursor/rules/omit.mdc
npx @sriinnu/omit init cline      # .clinerules/omit.md
npx @sriinnu/omit init windsurf   # .windsurf/rules/omit.md
npx @sriinnu/omit init all        # everything above
npx @sriinnu/omit hook install    # git pre-commit gate (works with ANY agent)

Claude Code(手册):将技能复制到您的项目或用户技能目录中:

skills/omit/SKILL.md  →  .claude/skills/omit/SKILL.md      (project)
                         ~/.claude/skills/omit/SKILL.md    (all projects)

Codex / Takumi /任何 AGENTS.md-aware 代理:将 AGENTS.md 复制到您的存储库根目录(或附加到现有根目录),或 npx @sriinnu/omit init codex。

GitHub Copilot:将 .github/copilot-instructions.md 复制到您的存储库中,或 npx @sriinnu/omit init copilot。

光标:将 .cursor/rules/omit.mdc 复制到您的存储库中。

Cline:将 .clinerules/omit.md 复制到您的存储库中。

Windsurf:将 .windsurf/rules/omit.md 复制到您的存储库中。

其他:将 AGENTS.md 的内容粘贴到代理的 custom-instructions/rules 机制中。这是简单的降价;没有什么可建造的。

// omitted: an MCP server: MCP exposes tools and data; omit is a behavioral
// discipline, and rule files + skills already deliver it. Add one only if
// omit ever grows verifiable tooling (e.g., a standalone diff auditor).

命令(克劳德代码)

  • /省略 [边距|红线|重写|off]:切换或显示当前模式
  • /omit-edit:对当前差异运行编辑器:标记膨胀、未引用的声明、缺少脚注和削减机会

释放

一个命令,三个目的地(npm、GitHub、Homebrew):

npm run release -- patch    # or minor / major

scripts/release.mjs 运行测试(通过 preversion),更新版本, 并通过 PR 将碰撞降落在主设备上(主设备不直接推动)。 一旦检查通过并且合并,脚本就会标记合并(签名,每个存储库) 政策)并推送标签 - 这会触发 publish.yml,发布到 npm 带有出处证明。然后它会削减 GitHub 版本 生成注释,等待注册表提供版本,并更新 omit sriinnu/homebrew-tap 中的公式, 再次通过PR。失败的步骤将按顺序中止发布。

切勿手动 npm publish:本地发布无法附加出处,并且 npm 不会让同一版本重新发布以供以后添加。如果CI 发布失败,修复 CI — 不要在本地解决它。

如果 NPM_TOKEN 秘密过时,请将新令牌放入 ~/.npmrc 并运行 npm run token:sync — 它根据注册表验证令牌 在推送之前,所以死令牌永远不会到达 CI。

现有技术

极简压力理念因马尾辫而流行,它当之无愧的明星。 omit 在重要的地方有所不同:快捷方式需要引用,差异在工作后*被编辑,安全线被枚举并且永远不会被删除,以及遗漏的内容被脚注而不是沉默。

点击查看更多
推荐专题
热门阅读