05. 测试、排错与速查
这一章是日常开发和发布时最实用的维护手册。
1. 核心验证命令
在发版或提交 PR 之前,建议至少执行:
bash
npm run typecheck
npm test
npm run build
npm run verify:package
npm run docs:build
npm pack --dry-run如果改了 /core、/providers、/runtime 等公开职责 subpath,再执行:
bash
npm run test:sdk-v2:coverage
npm run api:check
npm run package:checkpackage:check 会重新 build,并检查 package exports、公开 API snapshot、打包后导入和 npm pack --dry-run;因此它比单独的 typecheck 更接近发布门禁。
本地联调时还可以运行:
bash
npm run smoke
npm run example:hadamard-quickstart2. 常见问题
没有找到凭据
优先检查:
~/.hadamard/settings.json- 你是否先调用了
loadJsonConfigFile(...) HADAMARD_AUTH_TOKENHADAMARD_BASE_URL
找不到 session
检查:
session.id是否正确sessionDirectory是否被改过- 你是不是在另一个目录或另一个
homeDir下创建了 session - 默认目录是否在
~/.hadamard/projects/<workspace-key>,而不是旧版全局目录 - Runtime v2 是否注册了
RuntimeServices.sessions;只传sessionId不会自动创建存储
找不到工具
检查:
- 你是否把工具传给了
createAgentSdk(...) - 你是否挂上了正确的 MCP server
- Runtime v2 中
AgentSpec.tools的名称是否存在于ToolRegistry - 工具是否被
ToolPolicydeny 或 interrupt
找不到 skill
检查:
- 它是 bundled、custom,还是从磁盘加载的 skill
- skill 目录是否在搜索路径中
dream 没有触发
检查:
- 是否开启了
autoDreamEnabled - 是否已经累积了足够多的最近 session
- 是否刚刚才做过一次 consolidation
- lock 是否还在生效
buddy 没有生效
检查:
- 是否已经执行
sdk.buddy.hatch(...) - 是否被
mute()掉了 - 是否是在新的 SDK 实例里重新运行,导致状态还没初始化
Provider 能调用,但某项能力被拒绝
模块化 provider 会在请求前执行 capability preflight。检查:
- 模型是否支持 tools、parallel tool calls、structured output 或 reasoning
- 自定义 compatible endpoint 是否通过
capabilities显式声明真实能力 ModelRegistry中 provider ID 与defaultModel.provider是否一致- 是否错误地把 OpenAI Chat-compatible endpoint 配成 OpenAI Responses adapter
Bridge runtime 没有检测到
Hadamard SDK 本身不需要 Bridge。只有接外部 CLI 时才检查:
- 对应 CLI 是否在
PATH - 是否设置
HADAMARD_<PROVIDER>_PATH - bundle 是否已通过
npx hadamard-link-runtime链接 - 详细排查见 Bridge Runtime 附录
3. 常用示例命令
bash
npm run example:hadamard-quickstart
npm run example:hadamard-session
npm run example:hadamard-stream-loop
npm run example:hadamard-skills
npm run example:hadamard-memory
npm run example:hadamard-dream
npm run example:hadamard-swarm
npm run example:profiles4. API 速查
交互/兼容入口:
createAgentSdk(...)sdk.run(...)/sdk.stream(...)sdk.createSession(...)/sdk.resumeSession(...)sdk.skills.listMetadata()/sdk.runSkill(...)session.extractMemory(...)/session.compact(...)sdk.dreamState()/session.dream(...)sdk.buddy.hatch(...)sdk.swarm.createTeam(...)
模块化 Runtime:
new ModelRegistry([...providers])new AgentRuntime({ models, tools, services, middleware })runtime.run(agentSpec, input, options)runtime.stream(agentSpec, input, options)new ToolRegistry([...runtimeTools])new RuntimeServices({ sessions, checkpoints, ... })buildProfile(...)/runProfile(...)new WorkflowGraph(...)
5. ADR 是什么?
ADR 是 Architecture Decision Record,中文常译为“架构决策记录”。它不是教程、需求清单或会议纪要,而是一份短文档,用来回答:
- 当时遇到了什么架构问题。
- 考虑过哪些方案与约束。
- 最终选择了什么,为什么。
- 这个选择带来哪些后果,以及何时应重新评估。
典型文件名是 ADR-0001-use-local-session-store.md。状态通常为 proposed、accepted、superseded。ADR 应记录长期有效且影响多个模块的决定;临时实施步骤、竞品研究、迁移 runbook 和内部审计应放在本地忽略的 plan/,不应伪装成公开 ADR。
一个最小模板:
md
# ADR-0001: 使用项目主路径作为 Session locator
- Status: accepted
- Date: 2026-07-30
## Context
一个逻辑项目允许多个工作路径,但 Session 必须聚合到同一项目。
## Decision
Session 存储始终以项目主路径定位,活动工作路径只记录在 turn 元数据。
## Consequences
切换工作路径不会分裂聊天历史;主路径变更需要显式迁移策略。