Three coordinated things:
1. Resolve the committed upstream/main merge conflicts. 94 files were
sitting with raw <<<<<<< HEAD ... >>>>>>> upstream/main blocks. Every
conflict had HanzoBot/Bot on HEAD and OpenClaw on upstream. Resolved
by keeping HEAD everywhere — 540 conflict blocks.
2. Rewrite remaining OpenClaw text refs.
OPENCLAW → HANZO_BOT
OpenClaw → HanzoBot (PascalCase type identifiers)
openclaw → bot (codebase convention — botToken,
botUsername etc.; avoids invalid
hyphenated JS identifiers)
openclaw[_]/openclaw[A-Z] → bot[_]/bot[A-Z] (compound)
ai.openclaw.x → ai.hanzo.bot.x (JVM package path)
3. Delete or rename openclaw-named file paths (116 of them). Dead
duplicates with a Bot-named canonical from the partial migration:
deleted. Otherwise renamed.
ai/openclaw/** → deleted (ai/hanzo/bot/** canonical)
Sources/OpenClaw*/ → deleted (Sources/Bot* canonical)
Tests/OpenClawIPCTests/ → deleted (Tests/BotIPCTests canonical)
OpenClawKit/ → deleted (BotKit canonical)
openclaw-tools.*.ts → deleted (bot-tools.*.ts canonical)
openclaw-root.ts etc. → deleted (bot-root.ts canonical)
types.openclaw.ts → deleted (types.bot.ts canonical)
extensions/*/openclaw.plugin.json → renamed hanzo-bot.plugin.json
docs/start/openclaw.md → renamed hanzo-bot.md (+ zh-CN)
docs/assets/openclaw-*.png, whatsapp-openclaw*.jpg → deleted
scripts/.../openclaw-* → deleted (bot/hanzo-bot parallels)
openclaw.mjs → deleted (hanzo-bot.mjs is package.bin)
Then patched 65 broken JS/TS import strings where hanzo-bot had ended
up inside an import path ('./types.hanzo-bot.js' → './types.bot.js'
etc., since the on-disk filename uses the brand-neutral bot- prefix).
Pre-existing lint debt cleaned up to get oxlint --type-aware to 0/0:
removed the dead i18n test that referenced a path no longer existing;
defined the missing DIDConfig and WalletConfig types in types.base.ts
(they were imported but never declared); dropped unused imports;
collapsed redundant type assertion and a tautological meta.bot lookup
that the openclaw→bot rename made redundant.
The a2ui.bundle.js generated artifact is kept at its pre-rebrand
contents — it gets regenerated by 'pnpm canvas:a2ui:bundle' from
sources I cannot rebuild in this commit; the source side is clean.
Verified: 0 occurrences of openclaw (case-insensitive) in tree source
content, 0 file or directory paths with openclaw in the name; oxlint
--type-aware src test reports 0/0.
3.5 KiB
summary, read_when, title
| summary | read_when | title | |
|---|---|---|---|
| How to run tests locally (vitest) and when to use force/coverage modes |
|
Tests |
Tests
-
Full testing kit (suites, live, Docker): Testing
-
pnpm test:force: Kills any lingering gateway process holding the default control port, then runs the full Vitest suite with an isolated gateway port so server tests don’t collide with a running instance. Use this when a prior gateway run left port 18789 occupied. -
pnpm test:coverage: Runs the unit suite with V8 coverage (viavitest.unit.config.ts). Global thresholds are 70% lines/branches/functions/statements. Coverage excludes integration-heavy entrypoints (CLI wiring, gateway/telegram bridges, webchat static server) to keep the target focused on unit-testable logic. -
pnpm teston Node 24+: HanzoBot auto-disables VitestvmForksand usesforksto avoidERR_VM_MODULE_LINK_FAILURE/module is already linked. You can force behavior withBOT_TEST_VM_FORKS=0|1. -
pnpm test: runs the fast core unit lane by default for quick local feedback. -
pnpm test:channels: runs channel-heavy suites. -
pnpm test:extensions: runs extension/plugin suites. -
Gateway integration: opt-in via
BOT_TEST_INCLUDE_GATEWAY=1 pnpm testorpnpm test:gateway. -
pnpm test:e2e: Runs gateway end-to-end smoke tests (multi-instance WS/HTTP/node pairing). Defaults tovmForks+ adaptive workers invitest.e2e.config.ts; tune withBOT_E2E_WORKERS=<n>and setBOT_E2E_VERBOSE=1for verbose logs. -
pnpm test:live: Runs provider live tests (minimax/zai). Requires API keys andLIVE=1(or provider-specific*_LIVE_TEST=1) to unskip.
Local PR gate
For local PR land/gate checks, run:
pnpm checkpnpm buildpnpm testpnpm check:docs
If pnpm test flakes on a loaded host, rerun once before treating it as a regression, then isolate with pnpm vitest run <path/to/test>. For memory-constrained hosts, use:
BOT_TEST_PROFILE=low BOT_TEST_SERIAL_GATEWAY=1 pnpm test
Model latency bench (local keys)
Script: scripts/bench-model.ts
Usage:
source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10- Optional env:
MINIMAX_API_KEY,MINIMAX_BASE_URL,MINIMAX_MODEL,ANTHROPIC_API_KEY - Default prompt: “Reply with a single word: ok. No punctuation or extra text.”
Last run (2025-12-31, 20 runs):
- minimax median 1279ms (min 1114, max 2431)
- opus median 2454ms (min 1224, max 3170)
CLI startup bench
Script: scripts/bench-cli-startup.ts
Usage:
pnpm tsx scripts/bench-cli-startup.tspnpm tsx scripts/bench-cli-startup.ts --runs 12pnpm tsx scripts/bench-cli-startup.ts --entry dist/entry.js --timeout-ms 45000
This benchmarks these commands:
--version--helphealth --jsonstatus --jsonstatus
Output includes avg, p50, p95, min/max, and exit-code/signal distribution for each command.
Onboarding E2E (Docker)
Docker is optional; this is only needed for containerized onboarding smoke tests.
Full cold-start flow in a clean Linux container:
scripts/e2e/onboard-docker.sh
This script drives the interactive wizard via a pseudo-tty, verifies config/workspace/session files, then starts the gateway and runs hanzo-bot health.
QR import smoke (Docker)
Ensures qrcode-terminal loads under Node 22+ in Docker:
pnpm test:docker:qr