多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

用假 CLI 测真脚本:delegate-skills 冒烟测试矩阵与字节级一致性门的设计原理

用假 CLI 测真脚本:delegate-skills 冒烟测试矩阵与字节级一致性门的设计原理 用假 CLI 测真脚本delegate-skills 冒烟测试矩阵与字节级一致性门的设计原理【免费下载链接】delegate-skillsDelegate a coding task to a separate coding agent CLI, review the diff, land the commit yourself — one per implementer.项目地址: https://gitcode.com/gh_mirrors/de/delegate-skillsdelegate-skills 是一个让编排者把编码任务委派给独立 CLI 编程智能体Claude Code、Codex、Cursor、OpenCode 等 17 种实现者执行再由你自己审查差异并提交代码的技能包。每个技能都自带一个名为 relay.mjs 的调度脚本。这篇文章带你拆解它的两大质量基础设施冒烟测试矩阵和字节级一致性门——看看一个开源项目如何不依赖真实账号、不联网就把 17 个脚本测到每个字节都敢拍胸脯。为什么需要假 CLI一次真实的困境每个 relay 脚本的职责是启动一个真实的编程智能体 CLI、喂给它任务简报、解析它输出的 JSON 事件流、写出一份结构化的result.json报告。听起来很好测难点在于真实 CLI 需要登录态、API 密钥、网络且各家输出格式互不相同真实运行动辄几分钟无法在每次提交时全量回归最危险的场景卡死、超时、进程树残留恰恰是最难用真机稳定复现的。项目的答案是在 PATH 上放一个假 CLI。它不是空壳——fake-cli.cjs 会根据环境变量精确扮演目标 CLI 的行为应答--version预检、按各家的 JSON 事件协议吐报告、往工作区写文件、伪造权限拒绝、甚至永远挂起并偷偷派生一个孙进程。同一个脚本换一组环境变量就是另一个智能体。# 本地只跑一个模块的冒烟测试 node test/relay-smoke.mjs --only codex假 CLI 的安装一套 shim两种平台harness/install-shim.mjs 负责把假 CLI 种进 PATH这里藏着两个很见功力的细节平台做法原因macOS / Linux每个技能名写一个 shell 单行脚本转发给 fake-cli.cjs真实 CLI 多以原生二进制出现但 shell 转发足够代表Windows部分 CLI 用.cmd垫片部分直接用系统自带的 C# 编译器现场编译一个真.exe像 aider、oz 这类无 shell 直接启动原生二进制的场景.cmd垫片根本代表不了它——编译源码见 fake-cli.cs这就是假 CLI 也要假得像真的测试替身的启动方式必须和被测脚本真实启动目标的方式一致否则测出来的结论是假绿。冒烟测试矩阵26 个模块各守一道门relay-smoke.mjs 是入口注册表在 relay/index.mjs每个模块钉死一类契约。挑几个最有代表性的看设计思路模块钉死的行为timeout-tree超时 6 秒后relay 必须杀死实现者的整棵进程树连假 CLI 偷偷派生的孙进程一起result.json报status: timeout。另有乖父逆孙变体父进程响应 SIGTERM 后退出不听话的孙进程也必须被扫掉atomic给写盘操作人为减速证明result.json永不半写发布、运行结束后不留任何.tmp临时文件preflight假 CLI 可在版本探测时挂死或静默失败——relay 的预检必须有界不能卡死在没有任何报告文件的阶段timeout-bounds喂给--timeout一个畸形、零值或超出 Node 定时器上限的值不允许产生下一个 tick 就静默超时的暗雷read-only-tripwire用脏子模块、符号链接、非法 UTF-8 路径、大小写别名重命名、仅索引变更等场景验证只读违规绊线的三态判定不误报、不漏报orphan-stdio复刻 Windows 上孙子进程继承管道导致close永不触发的经典坑孤儿进程必须被清理relay 不能无限等待package-shape每个技能目录的形状检查SKILL.md、relay.mjs、恰好四篇参考文档、已登记注册表——新增一个技能忘注册矩阵测试直接红每个智能体还有一组快速成功用例假 CLI 捕获 relay 传来的参数原样、简报内容、环境变量并回吐各家的真实事件格式从而在无网络的沙箱里同时验证了发出去的命令对不对和读回来的解析对不对。字节级一致性门为什么 17 份代码必须一模一样这是整个仓库最有意思的设计决策。先看约束17 个relay.mjs共享约80–90% 近乎逐字相同的样板超时解析、进程树清理、git 变更收集等但技能是单目录安装的一次只拷贝一个技能目录跨目录import会让单独安装直接崩溃——所以共享代码必须内联在每份脚本里内联复制必然产生漂移历史上确实查到了比如空值守卫只存在于 claude 一份、超时解析的 BigInt 版本只在 10 份中的 8 份里。完整考古见 relay-core-dedup.md。于是方案不是抽公共库也不是写代码生成器而是三步先对齐再用门锁死让漂移无法落地。一致性门如何工作relay-parity.mjs 只有一百多行毫秒级跑完机制是锚点提取对每个被守护的符号如parseDuration、killChild、只读绊线全家桶等从每份 relay 里按顶层声明锚点切出源码——要求恰好一个匹配防止嵌套花括号切错逐字节对比所有副本必须一字不差包括格式与注释——这是刻意选择的字节级一致本身就是契约防漏网检查如果某个 relay 定义了某符号、却没出现在该符号的守护清单里同样判红。这堵住了新技能悄悄加入、带一份无人看守的副本的漏洞豁免需留名唯一签名确实不同的实现agy 的全树哈希判定必须登记进豁免表并写明理由——每一处不管了都是显式、可审计的。这个门在 CI 里排在慢速冒烟之前等于把17 份脚本共享逻辑是否走样从代码评审靠人眼盯变成了每次提交自动执行的硬门禁。规则也写进了 CONTRIBUTING.md改共享辅助函数 改一份、让 parity 点名过期副本、粘贴对齐。跑一遍看看node test/relay-parity.mjs # 毫秒级17 份脚本的字节级一致性 node test/relay-smoke.mjs # 慢速矩阵假 CLI 全场景回归两条命令绿了就意味着relay 的超时/中断/原子写契约没被破坏17 份内联副本没走样每个技能的目录形状完整。小结这套设计教会我们的三件事测试替身要假得像真的——启动机制、输出协议、故障形态都要与被测对象对齐否则是假绿危险场景值得专门造场景——挂死、孤儿管道、半写文件都是靠假 CLI 的故障模式开关稳定复现的不能抽共享库时就用门禁锁住复制——对齐一次然后让 CI 保证漂移无法落地比上代码生成器更简单、更诚实。延伸阅读README.md 的 Verification status 一节列出了每个技能在真实 CLI 上的逐条实跑验证记录——冒烟矩阵负责合同没变实跑记录负责真实世界也成立两者合起来才是完整的质量证据链。【免费下载链接】delegate-skillsDelegate a coding task to a separate coding agent CLI, review the diff, land the commit yourself — one per implementer.项目地址: https://gitcode.com/gh_mirrors/de/delegate-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表