news 2026/9/11 18:51:33

OpenHuman 调试命令指南:用 `pnpm debug` 为 Agent 提供有界输出与可追溯日志的测试运行器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenHuman 调试命令指南:用 `pnpm debug` 为 Agent 提供有界输出与可追溯日志的测试运行器

OpenHuman 调试命令指南:用pnpm debug为 Agent 提供有界输出与可追溯日志的测试运行器

【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman

本文面向在 OpenHuman(本地优先的个人 AI,仓库根目录即项目根)中调试 Rust 核心、前端 Vitest 单测与 WDIO E2E 的开发者与 AI Agent。scripts/debug/是一组围绕项目既有测试运行器的轻量封装,核心价值在于:把完整输出 tee 到target/debug-logs/下的日志文件,同时让 stdout 只保留摘要与失败块,从而让 Agent 的上下文不被海量原始输出淹没。读完本文,你将掌握pnpm debug unit | e2e | rust | logs的完整用法、参数约定、日志组织方式与底层实现原理。

为什么需要一套"Agent 友好"的测试封装

OpenHuman 同时维护三套测试体系:

  • Vitest(前端单测),由app/test/vitest.config.ts配置,入口脚本见 app/package.json 中的test:unit
  • WDIO E2E(端到端),spec 位于app/test/e2e/,底层由 app/scripts/e2e-run-spec.sh 委托给统一的会话运行器e2e-run-session.sh
  • cargo 测试(Rust 核心),经由 scripts/test-rust-with-mock.sh 携带 mock 后端运行。

这些运行器直接跑通常会产生几千行输出。对 LLM Agent 而言,把整份原始输出塞进上下文既不经济也容易淹没关键失败信息。scripts/debug/封装的核心目标在 README.md 中明确为三点:

  • 过滤——Vitest 支持位置参数(文件 pattern)+-t "<name>"按测试名过滤,WDIO 一次只跑一个 spec,Agent 不必每次改动都在整棵树里 grep;
  • 有界输出——默认摘要体量可控、适配 Agent 上下文;完整输出只需一条pnpm debug logs last即可取回;
  • 稳定接口——底层运行器的 flag 经常变动,而这组封装把契约收敛为"位置参数 + 少量 flag",避免 Agent 提示词因底层参数变动而失效。

需要强调的是,这些封装不取代项目原有测试运行器,它们只是以日志捕获的方式调用底层工具,退出码透传底层结果。

快速上手:四条核心命令

在仓库根目录执行(pnpm debug由根 package.json 的"debug": "bash scripts/debug/cli.sh"注册):

# Vitest 单测 pnpm debug unit # 全量跑 pnpm debug unit src/components/Foo.test.tsx # 只跑某个文件(位置参数) pnpm debug unit -t "renders empty state" # 按测试名过滤 pnpm debug unit Foo -t "renders empty" --verbose # WDIO E2E(一次一个 spec) pnpm debug e2e test/e2e/specs/smoke.spec.ts pnpm debug e2e test/e2e/specs/cron-jobs-flow.spec.ts cron-jobs --verbose # cargo 测试(内部调用 scripts/test-rust-with-mock.sh) pnpm debug rust pnpm debug rust json_rpc_e2e # 查看已保存的日志 pnpm debug logs # 列出最近 50 个 pnpm debug logs last # 打印最近一个(超长时默认显示末尾 400 行) pnpm debug logs unit # 打印匹配前缀 "unit" 的最近日志 pnpm debug logs last --tail 100

日志统一落在target/debug-logs/<kind>-<suffix>-<timestamp>.log。该目录按需创建(见下文lib.shdebug_log_dir),没有其他进程往这里写,删除它是安全的

参数一览

命令位置参数常用 flag底层调用
unit[pattern](文件或模糊路径)-t "<name>"--watch--verbose-- <vitest-args…>pnpm exec vitest run --config test/vitest.config.ts(在app/下执行)
e2e<spec>(spec 路径)+[log-suffix](可选)--verboseapp/scripts/e2e-run-spec.sh <spec> <suffix>
rust[test-filter](可传给底层脚本)--verbose-- <cargo-test-args…>scripts/test-rust-with-mock.sh
logslist/last/<run-id 或前缀>--head N--tail N内置脚本 scripts/debug/logs.sh

所有运行类命令的退出码均与底层工具一致,方便在 CI 或 Agent 工作流中直接按$?判断。

深入源码:分发器与共享日志机制

cli.sh:命令分发

入口 scripts/debug/cli.sh 是一个set -euo pipefail的 bash 分发器:unit|e2e|rust|logs直接exec同名脚本;harness-cache-auditagent-prepare-context-auditgoals-live三个审计命令则转交node执行对应的.mjs。不带参数或传-h/--help时打印完整 usage。这意味着未来新增调试子命令只需在case中加一行。

lib.sh:日志落盘与摘要提取

共享逻辑在 scripts/debug/lib.sh,三个关键函数:

  • debug_log_dir():定位仓库根,mkdir -p target/debug-logs并按需创建日志目录;
  • debug_run <log> <verbose> -- <cmd…>:核心执行函数。verbose=1时用tee同时写文件并流式输出,并借助${PIPESTATUS[0]}精确取回原始命令(而非tee)的退出码;非 verbose 时只把输出重定向到日志文件,随后打印摘要;
  • 三个摘要函数分别针对三种工具的输出格式做 grep/awk 提取:
    • debug_summarize_vitest:提取Test Files / Tests / Duration / Start at行与FAIL块(含 FAIL 之后前 200 行细节);
    • debug_summarize_wdio:提取 Mocha 风格的passing / failing / pending统计与编号失败详情;
    • debug_summarize_cargo:提取test result:行与failures:段。

这套"完整日志落盘 + 摘要上屏"的设计正是 Agent 上下文管理的核心——原始输出永不丢失,只是延迟读取。

unit.sh:Vitest 封装细节

scripts/debug/unit.sh 的参数解析值得注意:

  • 第一个非 flag 位置参数被当作 pattern,其余多余位置参数进入passthrough
  • -t/-t=<name>映射到 Vitest 的-t测试名过滤;
  • --watch会去掉run参数(Vitest 默认即 watch 模式);
  • --之后的所有参数原样透传给vitest
  • 执行时cdapp/,并以--config test/vitest.config.ts显式指定配置,保证无论从哪个目录调用都命中同一份配置。

e2e.sh:一次一个 spec

scripts/debug/e2e.sh 约束更严格:第一个位置参数是 spec 路径(必填),第二个是日志后缀;未提供后缀时自动取basename "$spec" .spec.ts,并将后缀中的非法字符替换为-${safe_suffix//[^[:alnum:]._-]/-}),保证日志文件名安全。随后调用 app/scripts/e2e-run-spec.sh,后者是一个薄 shim,最终exec到统一会话运行器e2e-run-session.sh(当前 E2E 全部运行在 Appium Chromium driver 上、附着 CEF 的 CDP 端口,不再区分 Mac2 与 tauri-driver 路径——参见该脚本头部注释)。

rust.sh 与 logs.sh

scripts/debug/rust.sh 将第一个位置参数作为 test-filter 追加到scripts/test-rust-with-mock.sh之后,同样支持--透传 cargo 参数。日志文件名为rust-<timestamp>.log

scripts/debug/logs.sh 是日志检索工具:list按修改时间倒序列出最近 50 个文件;last、精确文件名或前缀匹配均可解析到具体文件;默认若文件超过 400 行只显示末尾 400 行并给出提示,可用--head N/--tail N覆盖。解析失败(无匹配)时以非零码退出,便于脚本判断。

扩展:三只"活体审计"子命令

pnpm debug还暴露了三只基于 Node 的审计命令(见 cli.sh),它们面向真实运行环境做验证,与测试运行器互补:

  • harness-cache-audit(scripts/debug/harness-cache-audit.mjs):通过 JSON-RPC(默认http://127.0.0.1:7788/rpc,可用OPENHUMAN_CORE_RPC_URL覆盖;token 默认取OPENHUMAN_CORE_TOKEN或 workspace 下core.token)跑真实 harness turn,审计 transcript 的 token/缓存增量,不打印 prompt、response 或凭据正文
  • agent-prepare-context-audit:强制每轮调用agent_prepare_context工具,打印返回的上下文包(含recommended_skills)、scout 思考、所用 gathering 工具与 token/缓存/成本,并可通过种入 canary 事实 + transcript-recall 用例验证 scout 能检索历史会话(--no-seed-transcript可跳过);
  • goals-live:活测memory_goals流程(list/add/edit/delete + reflect 丰富化),打印 goals_agent 的思考、工具调用与成本。

这些命令体现了同一设计哲学:原始数据进文件、摘要进上下文、凭据不进日志

实践建议

  • Agent 工作流:先跑pnpm debug unit <改动文件> -t "<用例名>",失败时仅凭摘要定位;需要完整栈时再pnpm debug logs last
  • 日志管理target/debug-logs/可随时删除,它只属于本封装,不影响其他构建产物。
  • 排查底层差异:若怀疑封装行为与直接运行不一致,用--verbose观察被 tee 的原始命令输出,或直接按上文表格执行底层脚本对比。
  • 环境前提:E2E 需要项目既有的 WDIO/Appium 环境(spec 位于app/test/e2e/,配置见app/wdio.conf.ts);rust 测试依赖 mock 后端脚本 scripts/test-rust-with-mock.sh;unit 依赖app/下已安装的 pnpm 依赖。

小结

scripts/debug/用不到百行 bash 就把 OpenHuman 的三种测试运行器统一成一套"过滤 + 有界输出 + 可追溯日志"的稳定接口,同时保留底层工具的全部能力(位置参数、-t--watch--透传、退出码透传)。对于需要在上下文预算内高效定位失败的 AI Agent 与追求可复现调试的开发者,这是一套开箱即用的模式——完整实现可在 scripts/debug/ 目录内逐文件阅读。

【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 18:51:18

python自动化如何做的

一、使用库和框架 首先来讲, 它身为可供自动化Web浏览器操作运用的强大工具, 其次呢, 它支持多种浏览器, 同样对于多种编程语言而言, 它也是其中被支持那方, 最后, 它能够在自动化测试里头派上用场, 也能用于数据抓取工作, 还可用在表单填写等各种纷繁别样的任务之中。 使用 …

作者头像 李华
网站建设 2026/9/11 18:47:22

从零部署到团队跑通:OpenProject 项目管理实操上手指南

从零部署到团队跑通&#xff1a;OpenProject 项目管理实操上手指南 【免费下载链接】openproject OpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, is…

作者头像 李华