用途
bkit-evals 是 bkit-claude-code 项目中的一个技能质量评估运行器(Skill Quality Evaluation Runner),属于 v2.1.11 Sprint β FR-β2。它封装了 evals/runner.js,提供输入校验、结果持久化和结构化报告。此前用户需要直接执行 node evals/runner.js <skill>,必须自行记住 argv 结构,且忽略了超时和沙箱方面的顾虑;bkit-evals 取代了这种裸调用方式。
主要能力
run <skill>
执行单个技能的评估套件,例如 /bkit-evals run gap-detector。
具体行为:
- 使用正则 /^[a-z][a-z0-9-]{0,63}$/ 校验技能名。不符合者被拒绝(不允许 shell 元字符、斜杠、空格等)。
- 通过 child_process.spawnSync 以 argv 形式(非 shell)启动 node evals/runner.js --skill <skill>。默认超时 30 秒,最大 120 秒。--skill 标志形式由 runner CLI 规定,并由 L3 合约测试锁定。
- 捕获 stdout / stderr,通过括号平衡回退(字符串感知)解析末尾的 JSON 块。
- 应用失败关闭(fail-closed)防御:若 parsed === null 且 stdout 包含 Usage:,返回 reason: 'argv_format_mismatch';若 parsed === null 属于其他情况,返回 reason: 'parsed_null'。退出码为 0 绝不单独代表成功——必须存在解析后的 JSON。
- 将结构化结果持久化到 .bkit/runtime/evals-{skill}-{ISO timestamp}.json,包含 stdout/stderr 尾部(各 2000 字符)、解析后的 payload 以及 reason 字段。
- 在聊天中渲染一行摘要:退出码、解析后的通过/失败计数(若有)、持久化结果文件路径。
list
- 读取 evals/config.json 以枚举技能分类。
- 对每个分类(workflow、capability、hybrid),列出拥有 evals/{classification}/{skill}/eval.yaml 的技能。
- 渲染按分类分组的表格,包含技能名以及来自 eval YAML 的一行说明(若存在 description 字段)。
若不提供参数,渲染与 list 相同的输出。
使用方式
命令形式:
- /bkit-evals run gap-detector —— 执行单个评估
- /bkit-evals list —— 发现可用评估
参数说明:
- run <skill>:为单个技能执行评估套件,示例 /bkit-evals run gap-detector
- list:列出所有拥有 eval.yaml 定义的技能,示例 /bkit-evals list
安全设计
- 技能名正则防止参数注入。任何超出 [a-z][a-z0-9-]{0,63} 的输入会被拒绝,reason: invalid_skill_name。
- 使用 argv 数组方式 spawn(无 shell),不将模板字符串拼接进命令行。
- 结果文件路径由硬编码基址 + 净化后的技能名 + 时间戳组合,无法进行路径穿越。
- 强制执行子进程超时(默认 30 秒,硬上限 120 秒),使有缺陷的评估无法无限期阻塞会话。
适用场景
- 需要对单个技能运行质量评估并获取结构化结果时。
- 需要列出所有具备评估定义的技能进行发现时。
- 评估结果可贡献到信任评分(/control trust),并在 /code-review 评估技能时被使用。
- /bkit explore(FR-β1)可将 evals 作为类别进行探索。
模块依赖
- lib/evals/runner-wrapper.js 的 invokeEvals(skill, opts):校验 + spawn + 持久化
- lib/evals/runner-wrapper.js 的 isValidSkillName(name):与 list 共享的正则预检查
- evals/runner.js(子进程):现有评估执行引擎
结果 Schema
持久化文件 .bkit/runtime/evals-{skill}-{timestamp}.json 的字段包括:
- skill:技能名,例如 "gap-detector"
- invokedAt:ISO 8601 时间戳
- exitCode:退出码
- timedOut:是否超时
- stdoutTail:stdout 尾部
- stderrTail:stderr 尾部
- parsed:runner.js 打印的 JSON 内容,或 null
限制
资料未提供关于收费、价格、支持平台、运行环境要求、并发能力或评估指标体系细节的信息,暂未提供。