资讯动态

oh-my-openagent 计划合规性复审:omo-agent-toolkit 二进制重命名的 F1 审计与落地剖析

发布时间:2026/9/19 7:39:37 来源:尧图企业网站定制
oh-my-openagent 计划合规性复审omo-agent-toolkit 二进制重命名的 F1 审计与落地剖析【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent本文以 oh-my-openagent 仓库 .omo/evidence/20260809-omo-agent-toolkit-rename/F1.md 这一份计划合规性复审plan-compliance re-audit报告为主线完整解析一次涉及根包 bin 改名、Codex 安装器、Senpi 适配、Doctor 诊断、发布文档与 CI 工作流的跨模块重构是如何被逐条可证伪地验收与否决的。读完你将掌握大型重命名重构的验收清单如何组织Must have / Must NOT have / Success criteria 三层结构、独立复审者如何用 jq/rg/git diff/bun test/actionlint 等命令复核每一项声明以及大多数指标通过但整体仍 REJECT的评审决策逻辑同时以当前 dev 分支源码为准对照审计时点与落地后的差异。一、审计背景一次波及全仓的 bin 改名oh-my-openagent 在某一版本周期内执行了一项代号为omo-agent-toolkit-rename的重构将历史上由根 npm 包暴露的omo命令迁移为omo-agent-toolkit同时保持既有别名可用并引入OMO_EDITION环境变量做 Codex 版/OpenCode 版的安装与诊断路由。这项工作横跨根 package.json 的 bin 映射新增omo-agent-toolkit、移除omoCodex 安装器的运行时包装器linkRootRuntimeBin()Senpi 的 ulw-loop 命令解析器Doctor 健康诊断的预期 bin 集合与陈旧 bin 告警发布工作流、文档、README 与 CHANGELOG 的迁移故事。F1.md 是这项工作合并前的第二轮独立复审报告审计对象是功能分支feat/omo-agent-toolkit-rename固定在提交HEAD0018c0687c101602316c7a5b2ee489e722a90636对比基准为origin/dev...HEAD。报告开篇就交代了三个关键方法学约束结论钉死在提交上源码结论基于已提交的 HEAD可执行检查则使用相关生成产物构建完成后的检出树工作树允许有生成文件脏状态这是审计前就存在的不纳入本次判定审计只改动 F1.md 这一个结论文件保证复审本身可复现、可追溯。最终结论是REJECT理由附带了四个仍在阻塞的失败项。这份大部分通过但仍拒绝合并的报告本身就是一个值得拆解的高质量评审范本。二、Must have重命名必须达成的七项硬性要求F1 第一张表逐条引用了计划原文中的必须做到Must have要求并给出独立复核证据。以下逐条展开并补充当前仓库源码中的对应实现。#要求引自计划F1 独立复核结论判定1根 npm 包新增omo-agent-toolkit、移除omo、保留存活别名并增加OMO_EDITION路由jq -c .bin package.json恰好返回五个根别名且含omo-agent-toolkitjq -e .bin.omo package.json退出码为 1证明omo已被移除四个存活别名的--version与doctor --help均退出 0 且输出等价PASS2Codex 的linkRootRuntimeBin()只写omo-agent-toolkit导出调用名与版本edition删除生成的旧包装器保留用户自有的omo聚焦测试 15/15 通过覆盖常规生成文件删除、无标记保留、带标记符号链接删除且保留其目标、无标记符号链接保留、悬空符号链接容忍PASS3Senpi 适配使用三链接 toolkit 优先解析器绝不对裸omo做 PATH 解析.js通过process.execPath启动独立作用域执行通过了.js平台用例、全部解析器优先级用例、仅 PATH 裸omo的空结果用例与真实 PATH toolkit 调用用例PASS4所有面向 Agent 的omo ulw-loop/omo boulder发射点都要通过分类审计迁移旧输入仍被接受审计本身已修复并转绿bun test script/agent-command-string-audit.test.ts通过allowlist 中emit-migrate0、test-expectation0但 Senpi 技能仍在解析并指派被移除的命令见下文失败项 1FAIL5Doctor 使用移除后的 bin 集合对生成的陈旧omo告警、对用户自有的omo保持沉默遵循OMO_EDITION并使用改名后的引导标签独立 doctor/installer/Senpi 作用域运行 230/230 通过含标记告警、无标记沉默与 Codex 路由PASS6发布工作流、文档、README、CHANGELOG 讲清完整移除故事包括最终构成omo-ai senpi packages/*senpi*工作流断言与 actionlint 均干净根文档无命令模式命中但明确要求的构成公式仍未出现见失败项 3FAIL7现有 npm 与 Codex 安装自动迁移顺序lead-npm-qa.sh10/10 通过先安装已发布 latest链接omo再安装候选版本剪除omo并链接omo-agent-toolkitPASS2.1 根 bin 集与版本路由从 package.json 到 CLI 解析当前 dev 分支的 docs/reference/cli.md 直接印证了要求 1 的最终形态所有已发布包暴露同一套编译后 CLIbin 条目为omo-agent-toolkit短名文档与提示词推荐、oh-my-openagent与包名匹配的首选名、oh-my-opencode旧兼容名、lazycodex与lazycodex-aiLight 版快捷键安装默认--platformcodex并明确omobin 已在本 major release 中从这些包移除。版本edition路由在两个入口实现与 F1 引用的行号一致cli-program.ts 的resolveInstallArgs()当OMO_EDITION codex或调用名是lazycodex/lazycodex-ai时安装默认平台收敛为codexdoctor-target.ts 的resolveDoctorTarget()同样以OMO_EDITION codex为最高优先级其次才是调用名推断。2.2 linkRootRuntimeBin()只写新名、回收旧名、保留用户文件codex-cache-bins.ts 是要求 2 的核心实现。linkRootRuntimeBin()的行为可以归纳为三条原则只写omo-agent-toolkitconst binName omo-agent-toolkitWindows 下写omo-agent-toolkit.cmdPOSIX 下写同名可执行文件chmod 0o755回收生成的旧omolegacyPath指向binDir/omo或omo.cmd在写入新包装器前后都调用removeGeneratedRuntimeWrapper(legacyPath)——只删带生成标记的文件见下文标记机制缺失 CLI 时优雅降级若dist/cli/index.js不存在则不写任何包装器并删除旧的生成包装器返回null。同文件 codex-cache-bins.ts 顶部定义了保留名集合const RESERVED_NESTED_BIN_NAMES new Set([ omo, omo-agent-toolkit, lazycodex, lazycodex-ai, oh-my-opencode, oh-my-openagent, ])omo与omo-agent-toolkit同时保留前者用于识别/容忍用户自有的旧文件后者是新的规范名——这正是删生成、留用户语义的命名基础。2.3 运行包装器标记、版本导出与 ulw-loop 快速路径codex-cache-runtime-wrapper.ts 定义了两端共享的生成标记export const RUNTIME_WRAPPER_MARKER OMO_GENERATED_RUNTIME_WRAPPERPOSIX 包装器第 14-57 行导出两个关键环境变量export OMO_INVOCATION_NAME${binName} export OMO_EDITIONcodex并实现了ulw-loop参数快速转发exec omo-ulw-loop ulw-loop $、OMO_RUNTIMEnode时的 Node 回退、以及 bun 运行时探测PATH →~/.bun/bin/bun→ Homebrew/usr/local 候选路径全部缺失时报 127 并提示安装方式。Windows 版第 59-108 行用echo offrem OMO_GENERATED_RUNTIME_WRAPPER保留同样语义。这套标记是陈旧omo告警与无标记用户文件静默保留两类 Doctor 行为的分水岭。2.4 自动迁移的两处调用点要求 7 的现有安装自动迁移之所以成立是因为安装器与会话引导共用同一实现install-codex.ts当市场marketplace.name sisyphuslabs且插件名为omo时调用linkRootRuntimeBin()成功则打印Linked omo-agent-toolkit - target失败则降级提示setup.ts会话引导在 pluginRoot 存在dist/cli时同样调用linkRootRuntimeBin()缺失时把omo-agent-toolkit记入 degraded 列表提示改用npx lazycodex-ai。F1 的 task-6 聚合证据见 task-6.txt对这条路径做了实测先装已发布的 latest 会真的链接出omobin再装候选构建会剪除omo并链接omo-agent-toolkit——升级即迁移不是假设而是被测量出来的行为。三、Must NOT have十一条不得越界的护栏第二张表定义了重构的边界guardrails。这类约束在大型重构中往往比功能验收更重要因为它防止顺手改坏相邻系统。#护栏要求独立复核证据判定1不出现packages/omo-nativegit diff --name-only origin/dev...HEAD过滤该路径无输出PASS2不做omo-ai的发布/安装实现、beta 门控或受信发布者工作对工作流/文档的新增行搜索无实现命中仅有的omo-ai新增是上下文散文PASS3不提升 Senpi 依赖 pin对 package.json/bun.lock/各包 package.json 的 diff 搜索无senpi.*[0-9]/senpi命中PASS4除显式容忍的解析器/覆盖/用户文件/保留名场景外不留任何旧可执行omo残余仍被违反full-workflow.md:88-91解析/指派/探测旧omo另有omo get-local-version、omo install --platformsenpi、omo doctor等多处支持文档在推荐已死的命令FAIL5无 CLI 弃用分支、bin/omo.js或 Codex 转发器.bin.omo缺失、两个专属入口文件缺失、bin/oh-my-opencode.js无 diff、linkRootRuntimeBin()只写新名PASS6Senpi 解析器不做裸omo的 PATH 查找解析器只查omo-agent-toolkit仅 PATH 裸omo的用例通过PASS7不改 npm 包名仅根 package.json 变化基线与 HEAD 的.name均为oh-my-opencodePASS8不改市场身份Doctor 检查与 README 保留市场sisyphuslabs、插件omo、omosisyphuslabsPASS9不改OMO_*环境变量名源码 diff 仅新增OMO_EDITION、OMO_AGENT_TOOLKIT_BIN既有OMO_BIN未改名PASS10不改.omo/目录与omo.json配置名diff 中无相关重命名记录PASS11不改各组件 bin 名无组件 package.json 变化预期集合保留omo-rules、omo-lsp、omo-comment-checker、omo-ultrawork、omo-start-work-continuation、omo-telemetry、omo-git-bash-hookPASS12不改 Codex hook 接线diff 未命中任何 hook 相关 json隔离 QA 报告 hook 哈希跨安装逐字节一致PASS13不手工编辑生成产物变更的生成安装器通过生成束测试且含源码级符号链接回收逻辑Codex 同步/构建测试与test:codex全绿PASS14不改../senpi所有变更路径均在本仓库内PASS15不丢弃旧形式输入接受新旧形式共存于 steering 与 codex-hook解析器等价性用例通过PASS其中护栏 4旧omo残余是本次审计最大的争议点上一轮审计曾声称grep 为空但 F1 独立复核发现这些命中都是command -v omo、ULW_LOOP_CLIomo、$HOME/.local/bin/omo这类非omo verb可执行形式——它们绕过了按命令动词设计的正则。这正是审计必须独立于实现者的经典案例声称为空的一方被证实是 grep 模式盲区而不是真的没有残余。当前 dev 分支的 full-workflow.md 已把 bootstrap 全面转向OMO_AGENT_TOOLKIT_SDK_ROOTagentToolkitSDK见第 59-77 行的import(\${env(OMO_AGENT_TOOLKIT_SDK_ROOT)}/sdk.js)与agentToolkit.createGoals/status/completeGoals与审计时点引用的 CLI 探测逻辑已是两套形态从侧面印证了该阻塞项在后续迭代中确实被处理。四、Success criteria十条可证伪的成功标准第三张表把合并即算完成细化为可观察的验收标准每一条都点名了证据形态测试数量、命令输出、退出码、发布产物对比。#成功标准独立复核结论判定1全新打包根安装恰好 5 个 bin、无omo、toolkit 版本可用、尽力而为通知、lazycodex-ai 双 bin 发布不变顺序 npm QA 通过五 bin 集合与omo缺失独立打包安装执行omo-agent-toolkit --version退出 0、stdout4.19.4但 lazycodex-ai 的转换产物未被真正打包并与变更前基线对比FAIL2四个存活别名改名归一化后输出/退出行为一致无通知分支.bin.omo缺失8 次源码入口执行全部退出 0每个别名唯一的 help diff 只是命令变长后行内注释前空格缩水--version不变PASS3就地升级证明 npm 剪除omo、新增omo-agent-toolkit顺序lead-npm-qa.sh完成 latest→候选覆盖安装并通过剪除与规范链接断言PASS4Codex 安装只产规范包装器回收生成的普通文件与符号链接保留用户条目hook/bin 集合不变且幂等聚焦链接测试 15/15含全部符号链接用例顺序隔离安装器 QA 13/13PASS5Doctor 对全新、已迁移、标记陈旧、无标记用户、Codex 版五态正确独立 doctor/installer 作用域运行 230/230含缺失规范检测、标记陈旧告警、无标记沉默、OMO_EDITIONcodex路由PASS6分类审计全绿且无 emit/test 条目每条发射指令用规范命令旧输入仍被接受审计转绿、TOML 已迁移、解析器兼容通过但因技能与文档仍发射死命令而失败FAIL7发布冒烟断言规范存在、omo缺失、生成物移除、用户保留与 actionlint下个发布运行通过静态断言存在于 publish.yml工作流测试与 actionlint 通过但合并后的真实发布运行尚未发生FAIL8文档与 CHANGELOG 承载完整移除故事无文档建议裸omo不推荐 shell 别名根 README 与 docs 零旧命令命中、CHANGELOG 有破坏性迁移条目、无alias omo...但三个活跃支持文档仍在推荐死命令FAIL9bun test、bun run typecheck、bun run test:codex全绿无 omo-ai/omo-native 范围扩张独立隔离执行typecheck 退出 0test:codex 519 通过/0 失败bun test13454 通过/5 跳过/0 失败PASS10命名终态全仓文档化含omo-ai senpi packages/*senpi*omo保持保留保留名集合同时含omo与omo-agent-toolkit但构成公式在 cli.md 与 CHANGELOG 中缺失活跃旧命令指令仍在FAIL十条标准 5 过 5 挂失败项全部指向文档/发射指令/证据完整性这类可观察但常被忽略的维度——功能代码全部达标风险却集中在叙事与残留上。五、六个历史阻塞项的逐项处置F1 专门用一张表交代上一轮审计的六个阻塞如何被处置其中两个被推翻、三个被修复、一个被证实仍然存在还有一条我错了的自我更正上一轮阻塞处置关键证据1. 审计扫描自己的 allowlistFIXEDagent-command-string-audit.test.ts 显式排除 agent-command-string-audit.allowlist.json2. 八个 Ultrawork agent TOML 仍用omo ulw-loopFIXED定向 rg 无旧命令命中allowlist 计数变为emit-migrate0、test-expectation0、docs73. Senpi 技能解析/指派旧omoSTILL-BROKEN——上一轮审计是对的full-workflow.md:88的command -v omo、:89的ULW_LOOP_CLIomo、:91的路径探测声称的空 grep 漏掉了非omo verb可执行形式4. 四个归一化别名输出存在空格差异WITHDRAWN——我错了独立比较证明每个别名只有一行变化命令变长后行内注释前缩进缩水对齐感知归一化后四者完全相等退出码与语义未变5. 聚合的 task-6 证据缺失FIXEDtask-6.txt 已补齐独立顺序 npm QA 10/10、Codex QA 13/136. 必需的omo-ai senpi packages/*senpi*文档缺失STILL-BROKEN——上一轮审计是对的cli.md 与 CHANGELOG 只写为未来原生版保留未引用或描述构成公式阻塞 4 是本次复审最值得玩味的一格上一轮把四个别名的 help 输出差异对齐空格的缩水当作失败F1 独立复核后主动撤回了自己的判断——omo-agent-toolkit比omo长 14 个字符行内注释# Codex/LazyCodex diagnostics only前的填充空格随之减少纯格式变化、无语义变化。这展示了审计纪律的另一面结论必须跟着证据走包括推翻自己上一轮的结论。阻塞 3 与 6则展示了审计的笨功夫价值阻塞 3 的根因是 grep 模式只匹配omo verb形态漏掉了解析/赋值/探测语句阻塞 6 则是写了保留声明但没写计划要求的构成公式——两者都不是代码缺陷而是证据采集方式与叙事完整性的问题恰好是最容易被实现者自我说服带过的部分。六、Verdict为什么大部分通过仍整体 REJECTF1 的结论段落值得原样理解其逻辑REJECT 不是对功能代码的否定而是对合并就绪状态的否定。四项阻断失败是Senpi 工作流技能仍在full-workflow.md:88-91做可执行的旧omo发现与指派已发布的支持与 Doctor 表面仍在推荐被移除的命令omo get-local-version、omo install、omo doctor计划要求的命名构成omo-ai senpi packages/*senpi*仍未文档化转换后的 lazycodex-ai 包未真正打包并与基线对比真实合并后发布冒烟未运行——这两条显式成功标准仍未得到证明。这背后是一条明确的评审原则代码对但残留旧命令的文档会让用户执行到不存在的命令与该打包对比的没打包、该跑真实冒烟的没跑属于必须阻塞合并的完成度缺口而不是可以事后补的润色。允许解析器/覆盖/用户文件/保留名四种显式容忍场景也说明护栏不是一刀切技术债可以共存但不能无声扩散。七、从审计到落地当前 dev 分支的状态对照审计钉死在提交 0018c068 上而当前工作树已处于 dev 分支、版本推进到 5.0.0-beta.69CHANGELOG 顶部条目日期 2026-09-17。用当前树回看审计结论可以得出几条可验证的对照改名已落地。docs/reference/cli.md 的 Bin Commands 一节正是 F1 要求 1 所描述的终态五个 bin、omo移除、omo-agent-toolkit居首。omo的名字归属也按保留叙事落地——表中的omo/omo-ai仅存在于 npm beta 通道npm i -g omo-aibeta裸npm i -g omo-ai会故意失败且omo-agent-toolkit不会被omo-ai声明不过正如 F1 指出的计划要求的精确构成公式senpi packages/*senpi*在 cli.md 的这段文字里仍未以原文出现它写的是Launches the pinned senpi release with the full OMO extension loaded。聚合证据链完整可查。task-6.txt 记录的正是 F1 判定 PASS 的那批独立验证npm 版 10/10、Codex 版 13/13、三项全仓门禁bun run typecheck退出 0、bun run test:codex519 通过、bun test13454 通过/5 跳过/0 失败跨 1735 个文件以及范围保真 greps无 omo-native 路径、无 omo-ai 发布步骤、无 Senpi pin 提升、无 npm/市场/环境变量/组件 bin 改名、无 hook 接线变更jq -e .bin.omo package.json退出 1。该文件还诚实记录了边界发布工作流自身的冒烟运行在 GitHub Actions 内针对已发布 tarball 执行合并前只能以 actionlint 工作流形状 pinning 测试 本地隔离安装作为替身。Doctor 的预期 bin 集可直读。codex.ts 的CODEX_BIN_NAMES常量就是 F1 引用的后移除 bin 集合omo-agent-toolkit、omo-rules、omo-lsp、omo-comment-checker、omo-ultrawork、omo-ulw-execute-continuation、omo-telemetry、omo-git-bash-hook——组件 bin 一个没动护栏 11 成立只有根运行包装器换了名。Senpi 侧已换形态。F1 引用的审计时点实现Senpi 解析器位于packages/omo-senpi/src/components/ulw-loop/omo-command.ts含OMO_BIN读取在当前 dev 树中已被 SDK 化取代技能文档以OMO_AGENT_TOOLKIT_SDK_ROOT为入口所有 ulw-loop 操作都走agentToolkitSDK 方法createGoals、completeGoals、get_goal、steer等错误以{ ok:false, error:{ code, message } }信封返回状态落盘在.omo/ulw-loop/session-id/并由.state.lock串行化。可以推断审计指出的可执行旧omo探测正是被这条 SDK 化路线从根上替换掉的。发布工作流已携带断言。publish.yml 中存在 F1 点名的跳过检测对oh-my-openagentversion与lazycodex-aiversion向 npm registry 发 HEAD 请求已发布则skiptrue与版本戳写逻辑同时该工作流当前也包含OMO_AI_VERSION与packages/omo-native/package.json的版本戳写——这是审计时点之后 dev 向 omo-ai 原生版演进的新增内容与 F1 针对功能分支的无 omo-native护栏并不矛盾护栏约束的是那次 PR 的 diff 范围。八、方法论如何复现一次计划合规性复审F1 的价值不止于结论更在于它是一份可复制的审计操作手册。把它的命令与手法提炼出来1. 证据钉死到提交。记录HEAD哈希与对比基准origin/dev...HEAD并声明审计只改结论文件——任何复核都可以用同一提交重放。2. 用 jq 验证包清单事实而不是用眼睛。jq -c .bin package.json # 期望恰好五个别名且含 omo-agent-toolkit jq -e .bin.omo package.json # 期望退出码 1omo 已移除3. 用 git diff 验证范围护栏。git diff --name-only origin/dev...HEAD | rg ^packages/omo-native(/|$) git diff --name-only origin/dev...HEAD | rg ^\.\./senpi|^senpi/ git diff --name-status origin/dev...HEAD | rg ^R.*(\.omo/|omo\.json)4. 用 rg 验证没有但要对模式盲区保持警惕。阻塞 3 的教训是搜索旧命令时不能只匹配omo verb形态还要覆盖command -v omo、ULW_LOOP_CLIomo、路径探测$HOME/.local/bin/omo等可执行形式并主动检查 allowlist 是否包含被扫描对象自身阻塞 1 的教训。5. 用独立执行而不是声称证明行为。四个存活别名的--version各跑一次8 次执行全退出 0、真实 PATH 下调用 toolkit、OMO_EDITIONcodex路由、标记陈旧告警与无标记沉默——全部是可重放的命令级证据。6. 用隔离环境做破坏性测试。task-6 的做法值得直接复用npm 侧用--prefix指向mktemp目录并包出 tarball 读 bin 映射Codex 侧把HOME、CODEX_HOME、CODEX_LOCAL_BIN_DIR全部派生到一次性 ROOT真实~/.codex从不成为写入目标升级路径按先装 latest、再覆盖安装候选的顺序实测剪除与新增结束附带清理收据。7. 用静态工具补足无法在合并前运行的部分。发布工作流的真实冒烟只能在合并后的 Actions 里跑合并前的替身是bunx actionlint .github/workflows/publish.yml加工作流形状 pinning 测试——并且要像 F1 那样在结论里明确标注未运行的真实冒烟本身就是一个未证明项而不是假装它等价。九、小结F1 复审最终以 REJECT 收场但这正是它的成功功能代码 15/15、13/13、230/230、519/0、13454/0 全绿护栏 15 项中 14 项干净却因为四类可观察缺口——技能里的死命令、支持文档里的死命令、缺失的构成公式、未真正执行的打包对比与真实冒烟——被一票否决。它同时示范了审计的自我纠错撤回 spacing 差异误判与独立验证的价值戳穿grep 为空的盲区。从当前 dev 分支的代码看这条重命名路线最终完整落地omo-agent-toolkit成为唯一根运行包装器OMO_EDITION贯穿安装与 Doctor 路由Senpi 全面 SDK 化omo作为保留名让位于 beta 通道的 omo-ai 原生版。对任何正在规划改名/迁移/弃用类重构的团队这份 F1.md 连同 task-6.txt 都是一份可以直接照抄的验收蓝本把必须做到、不得越界、成功标准、历史阻塞、明确否决理由写成可执行、可重放、可被推翻的表格重构的质量就不再取决于实现者的自我感觉。【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价