十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

oh-my-openagent 中 omo-senpi 适配器的依赖升级证据链:以 @code-yeongyu/senpi 2026.8.23 升级为例

oh-my-openagent 中 omo-senpi 适配器的依赖升级证据链:以 @code-yeongyu/senpi 2026.8.23 升级为例 oh-my-openagent 中 omo-senpi 适配器的依赖升级证据链以 code-yeongyu/senpi 2026.8.23 升级为例【免费下载链接】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 仓库中一次真实的依赖升级code-yeongyu/senpi由2026.8.22-2升级至2026.8.23为样本完整拆解omo-senpi适配器在升级上游依赖时遵循的「四级验收门禁 既有失败基线归因 风险面最小化」证据流程。读者读完将掌握如何在外部 loader 别名架构下避免 bundle 重生成、如何用契约测试锁定依赖版本、如何用隔离沙箱做真实二进制级的适配器 QA以及如何区分升级引入的失败与基线既有失败。一、背景omo-senpi 适配器与上游 senpi 的耦合关系omo-senpi见 packages/omo-senpi/package.json描述为Senpi harness adapter for oh-my-openagent是 oh-my-openagent 中负责把上游code-yeongyu/senpi编码智能体接入 OmO 体系的适配器层。它并不 fork 上游而是把 senpi 作为外部依赖精确固定版本使用// packages/omo-senpi/package.json peerDependencies: { code-yeongyu/senpi: 2026.9.17-2 }, peerDependenciesMeta: { code-yeongyu/senpi: { optional: true } }, devDependencies: { code-yeongyu/senpi: 2026.9.17-2 }注意当前仓库中该版本已被后续升级推进到2026.9.17-2本文描述的证据文档.omo/evidence/omo-senpi-adapter/20260823-senpi-20260823-bump/README.md记录的是一次历史升级2026.8.22-2→2026.8.23但其流程机制至今仍在复用——这正是本文要还原的内容。该次升级对应的上游 v2026.8.23 包含三个修复#1090detached eval cell 通知改为以内部自定义消息internal custom messages投递而非合成用户输入synthetic user input——即修复 composer STEERING 泄漏问题#1092kimi xtml channel marker 泄漏修复#1088cursor composer operating prefix 相关修复。二、升级的实际改动四份 manifest、锁文件与契约测试一次合格的依赖升级必须明确动了哪些文件、为什么这些文件是充分且必要的。本次升级的落点集中在三处1. 四处 manifest 同步 pin 版本code-yeongyu/senpi被精确 pin 在四处 manifest 中升级时四者必须同步移动任何一处遗漏都会造成工作区版本漂移Manifest作用根package.json工作区整体依赖声明devDependenciespackages/omo-senpi/package.json适配器的 peer dev 双 pinpackages/senpi-task/package.jsonsenpi-task 侧依赖packages/omo-native/package.json原生运行时侧依赖2. bun.lock 刷新版本移动后通过bun install重新生成bun.lock保证锁文件与 manifest 一致。3. package-shape 契约测试同步移动 pinpackages/omo-senpi/src/package-shape.test.ts 是 omo-senpi 的包形状契约测试它把版本 pin 直接写进了断言peer dev 双断言并断言optional: trueexpect(peerDependencies[code-yeongyu/senpi]).toBe(2026.9.17-2) expect(peerDependenciesMeta[code-yeongyu/senpi]).toMatchObject({ optional: true }) expect(devDependencies[code-yeongyu/senpi]).toBe(2026.9.17-2)同时该测试还守护了更广的包形状契约包名必须为oh-my-opencode/omo-senpi、必须为private、exports 必须恰好为[., ./agent-home, ./extension, ./install]、脚本必须包含typecheck与test、根工作区必须注册packages/omo-senpi且不得注册packages/lsp-daemon。这意味着任何一次版本升级如果不同步更新测试断言CI 会直接红——这份契约测试就是版本升级的强制随动机制。三、为什么不需要重新生成 bundleSENPI_LOADER_ALIASES 外部加载器别名升级上游依赖时最危险的隐性风险是bundle 里内联了旧版本的上游代码导致锁文件是新的、产物是旧的。本仓库通过loader 别名外部化设计从架构上消除了这一风险。在 packages/omo-senpi/plugin/scripts/build-extension.mjs 中// 该列表需与 senpi loader.ts 第 145-165 行逐字节保持一致 export const SENPI_LOADER_ALIASES [ earendil-works/pi-coding-agent, earendil-works/pi-agent-core, earendil-works/pi-tui, earendil-works/pi-ai, earendil-works/pi-ai/compat, earendil-works/pi-ai/oauth, code-yeongyu/senpi, // ... 其余 pi-* 与 typebox 相关别名 ]SENPI_LOADER_ALIASES中的全部 specifier 会被并入externalSpecifiers在bun build时以--external方式处理提交进仓库的 bundle 因此并不内联 senpi 代码运行时由 senpi 的 loader 在扩展加载路径上按别名解析真实版本。所以版本升级只改变安装树与锁文件不需要重新生成并提交 bundle。这一架构下产物是否与当前源码一致由--check模式守护。build-extension.mjs的 CLI 入口在--check时会依次对stage-lsp-daemon-runtime.mjs、stage-ast-grep-mcp-runtime.mjs、stage-x-search-skill.mjs三个运行时暂存脚本执行--check调用checkExtensionCurrent()在系统临时目录mkdtemp中重新构建全部入口omo.js、omo-task.js、omo-member.js、memory-run-supervisor.mjs、omo-init-deep-advisor.js以及 toolkit SDK再用artifactsMatch与已提交产物逐一比对并额外检查运行时 persona 是否存在陈旧产物findStaleRuntimePersona。之所以选择在仓库外的 tmpdir 重建是因为构建在仓库内会产生临时兄弟目录被自身哈希卷入的问题——源码注释记录了某 CI 上同一输入在仓库内外构建出现 673 vs 672 模块差异的真实案例。升级证据中node packages/omo-senpi/plugin/scripts/build-extension.mjs --check在新版本安装后退出码 0extension build is current即证明产物无需重生成。四、四级验收门禁Gates本次升级的证据核心是一张四行验收表每一级分别覆盖不同风险维度Gate命令结果Bundle currentnode packages/omo-senpi/plugin/scripts/build-extension.mjs --checkexit 0build currentTypechecknpx tsgo --noEmit -p packages/omo-senpi/tsconfig.jsonexit 0Unit suitebun run test:senpi2206 pass / 1 skip / 13 fail见下文归因Live adapter QASENPI_BINworktree/node_modules/.bin/senpi node packages/omo-senpi/scripts/qa/drive.mjs --out evidence目录drive-verdict.jsonresult PASS1. Bundle current验证产物不需要随版本重生成见上文第三节--check通过即说明上游版本升级不会污染已提交产物这是整个门禁体系的架构前提。2. Typecheck静态类型层面的适配器兼容性用tsgo --noEmit对 packages/omo-senpi/tsconfig.json 全量类型检查。该命令也封装在根 package.json 的typecheck:packages中属于 CI 常驻门禁。3. Unit suite2206 通过的单元测试根 package.json 中的test:senpi完整流水线为bun run build:senpi-plugin tsgo --noEmit -p packages/omo-senpi/tsconfig.json \ bun test --timeout 20000 packages/omo-senpi \ bun test ./.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs即先构建插件、再类型检查、再跑 20000ms 超时的单元套件、最后校验证据目录解析测试。升级后套件总数为 2206 pass / 1 skip / 13 fail——失败全部来自基线而非本次升级详见第五节。4. Live adapter QA真实二进制 隔离沙箱的端到端验证单元测试再全也无法覆盖真实 senpi 二进制 真实 agent 目录的组合。live QA 用SENPI_BIN环境变量指向安装后的真实senpi可执行文件worktree/node_modules/.bin/senpi由 packages/omo-senpi/scripts/qa/drive.mjs 驱动并把证据输出到证据目录。drive.mjs的隔离设计值得展开createSandbox()在mkdtemp临时目录中构建完整沙箱隔离的cwdproject、隔离的 agent 目录、以及独立的 XDG config/data/cache home——注释明确说明omo config loader 从 XDG_CONFIG_HOME 读取用户级配置不隔离就会让每个 lane 继承开发者真实的 ~/.config/omo失去可复现性seedSandbox()写入settings.jsondefaultProjectTrust: ask、packages: [pluginRoot]与trust.json对沙箱 cwd 预授权同时把真实的~/.senpi/agent与~/.omo/agent列为受保护状态验证驱动全程不得触碰。实际输出.omo/evidence/omo-senpi-adapter/20260823-senpi-20260823-bump/drive-verdict.json包含一组可机器判定的字段{ result: PASS, ultraworkInjected: true, commentChecker: PASS, realSenpiUntouched: true, providedSenpiCodingAgentDir: IGNORED, sandboxAgentDir: /private/var/folders/.../omo-senpi-qa-Amwn0u/agent, sandboxCwd: /private/var/folders/.../omo-senpi-qa-Amwn0u/project }各字段含义result: PASS为总判定ultraworkInjected: true表示 OmO 的 ultrawork 能力成功注入到新版本 senpi 会话commentChecker: PASS表示 comment-checker 链路在真实二进制下工作正常realSenpiUntouched: true表示真实~/.senpi/agent未被写入providedSenpiCodingAgentDir: IGNORED表示外部传入的 agent 目录被忽略、驱动强制使用沙箱目录sandboxAgentDir/sandboxCwd记录了本次运行实际的隔离路径供事后审计。五、13 个既有失败基线归因方法论测试没全绿不等于升级失败。本证据最值得借鉴的部分是把失败先归因再判定的方法论操作把升级改动 stash 掉在同一 worktree 的干净origin/dev上重跑对应套件得到完全一致的失败集合从而证明这些失败与升级无关。归因结果分三类10 ×createInitDeepAdvisorComponent/session_start component ordering在干净 dev 上对packages/omo-senpi/src/components/init-deep-advisor运行得到 90 pass / 10 fail与升级后失败集合完全一致1 × cli-local install/uninstall 往返测试在干净 dev 上于同一断言处失败位于packages/omo-senpi/src/install/cli-local.test.ts:1431 × OmO Native 产品身份测试native state path文档记载为既有问题——getOmoNativeStateDir在本地运行时解析到真实的~/.omo/agent导致本地环境无法满足该断言的隔离前提。升级归因结论应用升级后唯一由升级本身引入的失败是package-shape契约测试peer pin 未随动将 pin 移动后即修复。总数变化为 2205 → 2206 pass、14 → 13 fail——升级净增 1 个通过用例失败净减 1 个。六、为什么这些证据足够风险面分析升级证据文档对为什么这些证据就够了给出了明确的推理链这避免了无限加测的军备竞赛(a) manifest / lockfile 正确性由 package-shape 契约测试 锁文件一致性 类型检查三层覆盖——版本 pin 错、锁文件漂移、类型不兼容任一发生都会在此层暴露(b) 适配器 vs senpi 的运行时兼容性由 live drive 对真实安装的 2026.8.23 二进制的端到端运行覆盖且全程验证真实 agent 目录未被触碰(c) steering-leak 修复本身的正确性属于 senpi 上游内部实现已在 senpi PR #1090 中以 failing-first 测试 完整 CI 矩阵证明omo 不重复测试 senpi 内部逻辑——这既是边界意识也是风险归属的清晰划分。七、残余风险与流程启示残余风险13 个既有失败独立于本次升级、长期存在于 dev 分支属于已知存量本次升级未引入任何新风险。可复用的升级流程模板从该证据中可以提炼出适用于任何外部依赖精确 pin 适配器场景的四步流程同步移动所有 manifest pin 与契约测试断言让版本声明成为一个不可分割的整体由package-shape类契约测试强制执行确认产物无需重生成——若架构支持 loader 别名外部化用--check的 tmpdir 重建比对验证产物与源码一致跑四级门禁产物一致性 → 类型检查 → 单元套件 → 真实二进制 隔离沙箱的 live QA并把drive-verdict.json这类机器可读证据留档到.omo/evidence/目录对失败做基线归因stash 后在干净 dev 上复跑区分升级引入与存量既有只对前者负责修复。这套证据链不仅让一次版本升级可审计、可回放也为后续每次 senpi 迭代仓库当前已推进至2026.9.17-2pin提供了可复用的质量护栏。【免费下载链接】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),仅供参考
返回列表