OpenClaw ma trzy zestawy testów Vitest (unit/integration, e2e, live) oraz niewielki zestaw runnerów Docker. Ten dokument to przewodnik „jak testujemy”:Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
- Co obejmuje każdy zestaw (i czego celowo nie obejmuje).
- Które polecenia uruchamiać w typowych workflow (lokalnie, przed push, podczas debugowania).
- Jak testy live wykrywają dane uwierzytelniające i wybierają modele/providery.
- Jak dodawać regresje dla rzeczywistych problemów z modelami/providerami.
Stos QA (qa-lab, qa-channel, ścieżki transportu live) jest udokumentowany osobno:
- Omówienie QA - architektura, powierzchnia poleceń, tworzenie scenariuszy.
- Matrix QA - dokumentacja referencyjna dla
pnpm openclaw qa matrix. - Kanał QA - syntetyczny Plugin transportu używany przez scenariusze oparte na repozytorium.
qa i odsyła do powyższych materiałów referencyjnych.Szybki start
W większość dni:- Pełna bramka (oczekiwana przed push):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Szybsze lokalne uruchomienie pełnego zestawu na pojemnej maszynie:
pnpm test:max - Bezpośrednia pętla watch Vitest:
pnpm test:watch - Bezpośrednie wskazywanie plików obsługuje teraz także ścieżki extension/channel:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Podczas iteracji nad pojedynczą awarią najpierw preferuj uruchomienia ukierunkowane.
- Witryna QA oparta na Dockerze:
pnpm qa:lab:up - Ścieżka QA oparta na maszynie wirtualnej Linux:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
- Bramka pokrycia:
pnpm test:coverage - Zestaw E2E:
pnpm test:e2e
- Zestaw live (modele + sondy narzędzi/obrazów Gateway):
pnpm test:live - Ciche uruchomienie jednego pliku live:
pnpm test:live -- src/agents/models.profiles.live.test.ts - Raporty wydajności runtime: wyślij
OpenClaw Performancezlive_gpt54=truedla rzeczywistej tury agentaopenai/gpt-5.4albodeep_profile=truedla artefaktów CPU/sterty/trace Kova. Codzienne zaplanowane uruchomienia publikują artefakty ścieżek mock-provider, deep-profile i GPT 5.4 doopenclaw/clawgrit-reports, gdy skonfigurowanoCLAWGRIT_REPORTS_TOKEN. Raport mock-provider zawiera także źródłowe pomiary uruchamiania Gateway, pamięci, obciążenia Pluginami, powtarzanej pętli hello-loop z fake-model oraz startu CLI. - Przegląd modeli live w Dockerze:
pnpm test:docker:live-models- Każdy wybrany model uruchamia teraz turę tekstową oraz małą sondę w stylu odczytu pliku.
Modele, których metadane deklarują wejście
image, uruchamiają także niewielką turę obrazową. Wyłącz dodatkowe sondy za pomocąOPENCLAW_LIVE_MODEL_FILE_PROBE=0lubOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0podczas izolowania awarii providera. - Pokrycie CI: codzienne
OpenClaw Scheduled Live And E2E Checksoraz ręczneOpenClaw Release Checkswywołują wielorazowy workflow live/E2E zinclude_live_suites: true, co obejmuje osobne zadania macierzy modeli live w Dockerze shardowane według providera. - Dla ukierunkowanych ponowień w CI wyślij
OpenClaw Live And E2E Checks (Reusable)zinclude_live_suites: trueilive_models_only: true. - Dodawaj nowe, wartościowe sekrety providerów do
scripts/ci-hydrate-live-auth.shoraz.github/workflows/openclaw-live-and-e2e-checks-reusable.ymli jego wywołań zaplanowanych/release.
- Każdy wybrany model uruchamia teraz turę tekstową oraz małą sondę w stylu odczytu pliku.
Modele, których metadane deklarują wejście
- Native Codex bound-chat smoke:
pnpm test:docker:live-codex-bind- Uruchamia ścieżkę live Docker względem ścieżki app-server Codex, wiąże syntetyczną
wiadomość prywatną Slack za pomocą
/codex bind, wykonuje/codex fasti/codex permissions, a następnie weryfikuje, że zwykła odpowiedź i załącznik obrazu przechodzą przez natywne wiązanie Pluginu zamiast ACP.
- Uruchamia ścieżkę live Docker względem ścieżki app-server Codex, wiąże syntetyczną
wiadomość prywatną Slack za pomocą
- Codex app-server harness smoke:
pnpm test:docker:live-codex-harness- Uruchamia tury agenta Gateway przez należący do Pluginu harness app-server Codex,
weryfikuje
/codex statusi/codex models, a domyślnie wykonuje sondy obrazu, Cron MCP, podagenta i Guardian. Wyłącz sondę podagenta za pomocąOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0podczas izolowania innych awarii app-server Codex. Dla ukierunkowanego sprawdzenia podagenta wyłącz pozostałe sondy:OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness. To kończy działanie po sondzie podagenta, chyba że ustawionoOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0.
- Uruchamia tury agenta Gateway przez należący do Pluginu harness app-server Codex,
weryfikuje
- Codex on-demand install smoke:
pnpm test:docker:codex-on-demand- Instaluje spakowany tarball OpenClaw w Dockerze, uruchamia onboarding z kluczem API OpenAI
i weryfikuje, że Plugin Codex oraz zależność
@openai/codexzostały pobrane do zarządzanego katalogu głównego npm na żądanie.
- Instaluje spakowany tarball OpenClaw w Dockerze, uruchamia onboarding z kluczem API OpenAI
i weryfikuje, że Plugin Codex oraz zależność
- Live plugin tool dependency smoke:
pnpm test:docker:live-plugin-tool- Pakuje testowy Plugin z prawdziwą zależnością
slugify, instaluje go przeznpm-pack:, weryfikuje zależność w zarządzanym katalogu głównym npm, a następnie prosi model live OpenAI o wywołanie narzędzia Pluginu i zwrócenie ukrytego slug.
- Pakuje testowy Plugin z prawdziwą zależnością
- Crestodian rescue command smoke:
pnpm test:live:crestodian-rescue-channel- Opcjonalne, dodatkowe sprawdzenie powierzchni polecenia ratunkowego message-channel.
Wykonuje
/crestodian status, kolejkuje trwałą zmianę modelu, odpowiada/crestodian yesi weryfikuje ścieżkę zapisu audytu/konfiguracji.
- Opcjonalne, dodatkowe sprawdzenie powierzchni polecenia ratunkowego message-channel.
Wykonuje
- Crestodian planner Docker smoke:
pnpm test:docker:crestodian-planner- Uruchamia Crestodian w kontenerze bez konfiguracji z fałszywym Claude CLI w
PATHi weryfikuje, że fallback fuzzy planner przekłada się na audytowany, typowany zapis konfiguracji.
- Uruchamia Crestodian w kontenerze bez konfiguracji z fałszywym Claude CLI w
- Crestodian first-run Docker smoke:
pnpm test:docker:crestodian-first-run- Startuje z pustego katalogu stanu OpenClaw, kieruje zwykłe
openclawdo Crestodian, stosuje zapisy setup/model/agent/Plugin Discord + SecretRef, waliduje konfigurację i weryfikuje wpisy audytu. Ta sama ścieżka konfiguracji Ring 0 jest także pokryta w QA Lab przezpnpm openclaw qa suite --scenario crestodian-ring-zero-setup.
- Startuje z pustego katalogu stanu OpenClaw, kieruje zwykłe
- Moonshot/Kimi cost smoke: z ustawionym
MOONSHOT_API_KEYuruchomopenclaw models list --provider moonshot --json, a następnie uruchom izolowaneopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonwzględemmoonshot/kimi-k2.6. Zweryfikuj, że JSON raportuje Moonshot/K2.6, a transkrypcja asystenta zapisuje znormalizowaneusage.cost.
Runnery specyficzne dla QA
Te polecenia znajdują się obok głównych zestawów testów, gdy potrzebujesz realizmu QA Lab: CI uruchamia QA Lab w dedykowanych workflow. Parzystość agentowa jest zagnieżdżona podQA-Lab - All Lanes i walidacją release, a nie w samodzielnym workflow PR.
Szeroka walidacja powinna używać Full Release Validation z
rerun_group=qa-parity albo grupy QA release-checks. Stabilne/domyślne kontrole release
trzymają wyczerpujący live/Docker soak za run_release_soak=true; profil
full wymusza soak. QA-Lab - All Lanes
uruchamia się nocą na main oraz z ręcznego dispatch z lane mock parity, lane live
Matrix, zarządzaną przez Convex lane live Telegram i zarządzaną przez Convex lane live Discord
jako zadaniami równoległymi. Zaplanowane QA i kontrole release jawnie przekazują Matrix
--profile fast, podczas gdy domyślne wartości CLI Matrix i wejścia ręcznego workflow
pozostają all; ręczny dispatch może shardować all na zadania transport,
media, e2ee-smoke, e2ee-deep i e2ee-cli. OpenClaw Release Checks uruchamia parity oraz szybkie lane Matrix i Telegram przed zatwierdzeniem release,
używając mock-openai/gpt-5.5 do kontroli transportu release, aby pozostały
deterministyczne i uniknęły normalnego startu Pluginu providera. Te Gatewaye transportu live
wyłączają wyszukiwanie pamięci; zachowanie pamięci pozostaje pokryte przez zestawy QA parity.
Pełne shardy release live media używają
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, który ma już
ffmpeg i ffprobe. Shardy modeli/backendu live Docker używają współdzielonego obrazu
ghcr.io/openclaw/openclaw-live-test:<sha> zbudowanego raz dla wybranego
commitu, a następnie pobierają go z OPENCLAW_SKIP_DOCKER_BUILD=1 zamiast przebudowywać
w każdym shardzie.
pnpm openclaw qa suite- Uruchamia scenariusze QA oparte na repozytorium bezpośrednio na hoście.
- Domyślnie uruchamia wiele wybranych scenariuszy równolegle z izolowanymi
workerami gateway.
qa-channeldomyślnie używa współbieżności 4 (ograniczonej liczbą wybranych scenariuszy). Użyj--concurrency <count>, aby dostroić liczbę workerów, albo--concurrency 1dla starszej ścieżki szeregowej. - Kończy działanie kodem różnym od zera, gdy dowolny scenariusz się nie powiedzie. Użyj
--allow-failures, gdy chcesz artefakty bez błędnego kodu wyjścia. - Obsługuje tryby dostawcy
live-frontier,mock-openaiiaimock.aimockuruchamia lokalny serwer dostawcy oparty na AIMock dla eksperymentalnego pokrycia fixture i makiet protokołu bez zastępowania świadomej scenariuszy ścieżkimock-openai.
pnpm test:plugins:kitchen-sink-live- Uruchamia zestaw prób live pluginu OpenAI Kitchen Sink przez QA Lab. Instaluje
zewnętrzny pakiet Kitchen Sink, weryfikuje inwentarz powierzchni plugin SDK,
sonduje
/healthzi/readyz, zapisuje dowody CPU/RSS gateway, uruchamia turę live OpenAI i sprawdza diagnostykę adwersarialną. Wymaga autoryzacji live OpenAI, takiej jakOPENAI_API_KEY. W uwodnionych sesjach Testbox automatycznie ładuje profil autoryzacji live Testbox, gdy obecny jest helperopenclaw-testbox-env.
- Uruchamia zestaw prób live pluginu OpenAI Kitchen Sink przez QA Lab. Instaluje
zewnętrzny pakiet Kitchen Sink, weryfikuje inwentarz powierzchni plugin SDK,
sonduje
pnpm test:gateway:cpu-scenarios- Uruchamia benchmark startu gateway oraz mały pakiet scenariuszy mock QA Lab
(
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) i zapisuje połączone podsumowanie obserwacji CPU w.artifacts/gateway-cpu-scenarios/. - Domyślnie flaguje tylko utrzymujące się obserwacje wysokiego CPU (
--cpu-core-warnoraz--hot-wall-warn-ms), więc krótkie skoki podczas startu są zapisywane jako metryki bez wyglądania jak regresja wielominutowego zablokowania gateway. - Używa zbudowanych artefaktów
dist; najpierw uruchom build, gdy checkout nie ma jeszcze świeżego wyjścia runtime.
- Uruchamia benchmark startu gateway oraz mały pakiet scenariuszy mock QA Lab
(
pnpm openclaw qa suite --runner multipass- Uruchamia ten sam pakiet QA wewnątrz jednorazowej maszyny wirtualnej Multipass Linux.
- Zachowuje to samo zachowanie wyboru scenariuszy co
qa suitena hoście. - Ponownie używa tych samych flag wyboru dostawcy/modelu co
qa suite. - Uruchomienia live przekazują obsługiwane wejścia autoryzacji QA, które są praktyczne dla gościa:
klucze dostawców oparte na env, ścieżkę konfiguracji dostawcy QA live oraz
CODEX_HOME, gdy jest obecne. - Katalogi wyjściowe muszą pozostać pod korzeniem repozytorium, aby gość mógł zapisywać z powrotem przez zamontowany workspace.
- Zapisuje zwykły raport QA i podsumowanie oraz logi Multipass w
.artifacts/qa-e2e/....
pnpm qa:lab:up- Uruchamia wspieraną przez Docker stronę QA do pracy QA w stylu operatorskim.
pnpm test:docker:npm-onboard-channel-agent- Buduje tarball npm z bieżącego checkoutu, instaluje go globalnie w Docker, uruchamia nieinteraktywne wdrożenie z kluczem API OpenAI, domyślnie konfiguruje Telegram, weryfikuje, że spakowany runtime pluginu ładuje się bez naprawy zależności podczas startu, uruchamia doctor i wykonuje jedną lokalną turę agenta wobec zamockowanego endpointu OpenAI.
- Użyj
OPENCLAW_NPM_ONBOARD_CHANNEL=discord, aby uruchomić tę samą ścieżkę instalacji pakietowej z Discord.
pnpm test:docker:session-runtime-context- Uruchamia deterministyczny smoke Docker zbudowanej aplikacji dla osadzonych transkryptów kontekstu runtime.
Weryfikuje, że ukryty kontekst runtime OpenClaw jest utrwalany jako
niewyświetlana wiadomość niestandardowa zamiast wyciekać do widocznej tury użytkownika,
następnie zasiewa dotknięty problemem uszkodzony JSONL sesji i weryfikuje, że
openclaw doctor --fixprzepisuje go na aktywną gałąź z kopią zapasową.
- Uruchamia deterministyczny smoke Docker zbudowanej aplikacji dla osadzonych transkryptów kontekstu runtime.
Weryfikuje, że ukryty kontekst runtime OpenClaw jest utrwalany jako
niewyświetlana wiadomość niestandardowa zamiast wyciekać do widocznej tury użytkownika,
następnie zasiewa dotknięty problemem uszkodzony JSONL sesji i weryfikuje, że
pnpm test:docker:npm-telegram-live- Instaluje kandydujący pakiet OpenClaw w Docker, uruchamia wdrożenie zainstalowanego pakietu, konfiguruje Telegram przez zainstalowany CLI, a następnie ponownie używa ścieżki QA live Telegram z tym zainstalowanym pakietem jako Gateway SUT.
- Wrapper montuje tylko źródło harnessa
qa-labz checkoutu; zainstalowany pakiet jest właścicielemdist,openclaw/plugin-sdki dołączonego runtime pluginu, więc ścieżka nie miesza pluginów z bieżącego checkoutu z testowanym pakietem. - Domyślnie używa
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta; ustawOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzlubOPENCLAW_CURRENT_PACKAGE_TGZ, aby zamiast instalacji z rejestru przetestować rozwiązany lokalny tarball. - Używa tych samych poświadczeń env Telegram lub źródła poświadczeń Convex co
pnpm openclaw qa telegram. Dla automatyzacji CI/wydania ustawOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexorazOPENCLAW_QA_CONVEX_SITE_URLi sekret roli. JeśliOPENCLAW_QA_CONVEX_SITE_URLi sekret roli Convex są obecne w CI, wrapper Docker automatycznie wybiera Convex. - Wrapper weryfikuje env poświadczeń Telegram lub Convex na hoście przed
pracą Docker build/install. Ustaw
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1tylko przy celowym debugowaniu konfiguracji przed poświadczeniami. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainernadpisuje współdzieloneOPENCLAW_QA_CREDENTIAL_ROLEtylko dla tej ścieżki.- GitHub Actions udostępnia tę ścieżkę jako ręczny workflow maintainerów
NPM Telegram Beta E2E. Nie uruchamia się przy scaleniu. Workflow używa środowiskaqa-live-sharedi dzierżaw poświadczeń CI Convex.
- GitHub Actions udostępnia także
Package Acceptancejako poboczny dowód produktowy wobec jednego kandydującego pakietu. Przyjmuje zaufany ref, opublikowany spec npm, URL tarballa HTTPS plus SHA-256 albo artefakt tarballa z innego uruchomienia, przesyła znormalizowanyopenclaw-current.tgzjakopackage-under-test, a następnie uruchamia istniejący scheduler Docker E2E z profilami ścieżek smoke, package, product, full lub custom. Ustawtelegram_mode=mock-openaialbolive-frontier, aby uruchomić workflow QA Telegram wobec tego samego artefaktupackage-under-test.- Najnowszy dowód produktowy beta:
- Dowód dokładnego URL tarballa wymaga digestu:
- Dowód artefaktu pobiera artefakt tarballa z innego uruchomienia Actions:
-
pnpm test:docker:plugins- Pakuje i instaluje bieżący build OpenClaw w Docker, uruchamia Gateway ze skonfigurowanym OpenAI, a następnie włącza dołączone kanały/pluginy przez edycje konfiguracji.
- Weryfikuje, że wykrywanie konfiguracji pozostawia nieskonfigurowane pobieralne pluginy nieobecne, pierwsza skonfigurowana naprawa doctor instaluje każdy brakujący pobieralny plugin jawnie, a drugi restart nie uruchamia ukrytej naprawy zależności.
- Instaluje także znaną starszą bazę npm, włącza Telegram przed uruchomieniem
openclaw update --tag <candidate>i weryfikuje, że doctor kandydata po aktualizacji czyści pozostałości zależności legacy pluginów bez naprawy postinstall po stronie harnessa.
-
pnpm test:parallels:npm-update-
Uruchamia natywny smoke aktualizacji instalacji pakietowej na gościach Parallels. Każda
wybrana platforma najpierw instaluje żądany pakiet bazowy, następnie uruchamia
zainstalowaną komendę
openclaw updatew tym samym gościu i weryfikuje zainstalowaną wersję, status aktualizacji, gotowość gateway oraz jedną lokalną turę agenta. -
Użyj
--platform macos,--platform windowsalbo--platform linuxpodczas iteracji na jednym gościu. Użyj--json, aby uzyskać ścieżkę artefaktu podsumowania i status dla każdej ścieżki. -
Ścieżka OpenAI domyślnie używa
openai/gpt-5.5do dowodu tury agenta live. Przekaż--model <provider/model>albo ustawOPENCLAW_PARALLELS_OPENAI_MODEL, gdy celowo walidujesz inny model OpenAI. -
Owiń długie lokalne uruchomienia timeoutem hosta, aby zacięcia transportu Parallels nie mogły
zużyć reszty okna testowego:
-
Skrypt zapisuje zagnieżdżone logi ścieżek w
/tmp/openclaw-parallels-npm-update.*. Sprawdźwindows-update.log,macos-update.logalbolinux-update.logprzed założeniem, że zewnętrzny wrapper się zawiesił. - Aktualizacja Windows może spędzić od 10 do 15 minut na doctorze po aktualizacji i pracy aktualizacji pakietu na zimnym gościu; nadal jest to zdrowe, gdy zagnieżdżony log debug npm postępuje.
- Nie uruchamiaj tego zbiorczego wrappera równolegle z pojedynczymi ścieżkami smoke Parallels macOS, Windows lub Linux. Współdzielą stan VM i mogą kolidować przy przywracaniu snapshotu, serwowaniu pakietu lub stanie gateway gościa.
- Dowód po aktualizacji uruchamia zwykłą powierzchnię dołączonych pluginów, ponieważ fasady możliwości, takie jak mowa, generowanie obrazów i rozumienie mediów, są ładowane przez dołączone API runtime, nawet gdy sama tura agenta sprawdza tylko prostą odpowiedź tekstową.
-
Uruchamia natywny smoke aktualizacji instalacji pakietowej na gościach Parallels. Każda
wybrana platforma najpierw instaluje żądany pakiet bazowy, następnie uruchamia
zainstalowaną komendę
-
pnpm openclaw qa aimock- Uruchamia tylko lokalny serwer dostawcy AIMock do bezpośrednich testów smoke protokołu.
-
pnpm openclaw qa matrix- Uruchamia ścieżkę QA live Matrix wobec jednorazowego homeservera Tuwunel opartego na Docker. Tylko checkout źródeł - instalacje pakietowe nie zawierają
qa-lab. - Pełny CLI, katalog profili/scenariuszy, zmienne env i układ artefaktów: Matrix QA.
- Uruchamia ścieżkę QA live Matrix wobec jednorazowego homeservera Tuwunel opartego na Docker. Tylko checkout źródeł - instalacje pakietowe nie zawierają
-
pnpm openclaw qa telegram- Uruchamia ścieżkę QA live Telegram wobec prawdziwej grupy prywatnej, używając tokenów bota drivera i SUT z env.
- Wymaga
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENiOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. Identyfikator grupy musi być numerycznym identyfikatorem czatu Telegram. - Obsługuje
--credential-source convexdla współdzielonych pul poświadczeń. Domyślnie używaj trybu env albo ustawOPENCLAW_QA_CREDENTIAL_SOURCE=convex, aby włączyć dzierżawy z puli. - Domyślne ustawienia obejmują canary, bramkowanie wzmiankami, adresowanie komend,
/status, wspomniane odpowiedzi bot-do-bota i odpowiedzi natywnych komend core. Domyślne ustawieniamock-openaiobejmują także deterministyczne regresje łańcucha odpowiedzi i streamingu final-message Telegram. Użyj--list-scenariosdla opcjonalnych sond, takich jaksession_status. - Kończy działanie kodem różnym od zera, gdy dowolny scenariusz się nie powiedzie. Użyj
--allow-failures, gdy chcesz artefakty bez błędnego kodu wyjścia. - Wymaga dwóch odrębnych botów w tej samej grupie prywatnej, z botem SUT udostępniającym nazwę użytkownika Telegram.
- Dla stabilnej obserwacji bot-do-bota włącz Bot-to-Bot Communication Mode w
@BotFatherdla obu botów i upewnij się, że bot drivera może obserwować ruch botów w grupie. - Zapisuje raport QA Telegram, podsumowanie i artefakt obserwowanych wiadomości w
.artifacts/qa-e2e/.... Scenariusze z odpowiedziami obejmują RTT od żądania wysłania drivera do zaobserwowanej odpowiedzi SUT.
Mantis Telegram Live to wrapper dowodowy PR wokół tej ścieżki. Uruchamia
kandydujący ref z poświadczeniami Telegram dzierżawionymi z Convex, renderuje zredagowany
transkrypt obserwowanych wiadomości w przeglądarce desktopowej Crabbox, nagrywa dowód MP4,
generuje GIF przycięty do ruchu, przesyła pakiet artefaktów i publikuje wbudowany dowód PR
przez Mantis GitHub App, gdy ustawiono pr_number. Maintainerzy mogą
uruchomić go z UI Actions przez Mantis Scenario (scenario_id: telegram-live) albo bezpośrednio z komentarza pull requesta:
Mantis Telegram Desktop Proof to agentowy natywny wrapper Telegram Desktop
przed/po dla wizualnego dowodu PR. Uruchom go z UI Actions z
dowolnymi instructions, przez Mantis Scenario (scenario_id: telegram-desktop-proof) albo z komentarza PR:
motionPreview i publikuje tę samą 2-kolumnową tabelę GIF-ów przez
Mantis GitHub App, gdy ustawiono pr_number.
pnpm openclaw qa mantis telegram-desktop-builder- Dzierżawi lub ponownie używa pulpitu Crabbox Linux, instaluje natywny Telegram Desktop, konfiguruje OpenClaw z dzierżawionym tokenem bota SUT Telegram, uruchamia gateway i nagrywa dowody w postaci zrzutów ekranu/MP4 z widocznego pulpitu VNC.
- Domyślnie używa
--credential-source convex, więc przepływy pracy potrzebują tylko sekretu brokera Convex. Użyj--credential-source envz tymi samymi zmiennymiOPENCLAW_QA_TELEGRAM_*copnpm openclaw qa telegram. - Telegram Desktop nadal wymaga logowania/profilu użytkownika. Token bota konfiguruje tylko OpenClaw. Użyj
--telegram-profile-archive-env <name>dla archiwum profilu.tgzw base64 albo użyj--keep-leasei zaloguj się raz ręcznie przez VNC. - Zapisuje
mantis-telegram-desktop-builder-report.md,mantis-telegram-desktop-builder-summary.json,telegram-desktop-builder.pngitelegram-desktop-builder.mp4w katalogu wyjściowym.
qa-channel to szeroki syntetyczny zestaw testów i nie jest częścią tej macierzy.
Współdzielone poświadczenia Telegram przez Convex (v1)
Gdy--credential-source convex (lub OPENCLAW_QA_CREDENTIAL_SOURCE=convex) jest włączone dla
QA transportu live, QA lab uzyskuje wyłączną dzierżawę z puli opartej na Convex, wysyła Heartbeat dla tej
dzierżawy podczas działania ścieżki i zwalnia dzierżawę przy zamykaniu. Nazwa sekcji powstała przed
obsługą Discord, Slack i WhatsApp; kontrakt dzierżawy jest współdzielony między rodzajami.
Referencyjny szkielet projektu Convex:
qa/convex-credential-broker/
OPENCLAW_QA_CONVEX_SITE_URL(na przykładhttps://your-deployment.convex.site)- Jeden sekret dla wybranej roli:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERdlamaintainerOPENCLAW_QA_CONVEX_SECRET_CIdlaci
- Wybór roli poświadczeń:
- CLI:
--credential-role maintainer|ci - Domyślna wartość środowiskowa:
OPENCLAW_QA_CREDENTIAL_ROLE(domyślnieciw CI, w przeciwnym raziemaintainer)
- CLI:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(domyślnie1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(domyślnie30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(domyślnie90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(domyślnie15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(domyślnie/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(opcjonalny identyfikator śledzenia)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1pozwala na adresy URL Convex z loopbackhttp://wyłącznie do lokalnego developmentu.
OPENCLAW_QA_CONVEX_SITE_URL powinno używać https:// podczas normalnej pracy.
Polecenia administracyjne maintainerów (dodawanie/usuwanie/listowanie puli) wymagają
konkretnie OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
Pomocnicze polecenia CLI dla maintainerów:
doctor przed uruchomieniami live, aby sprawdzić adres URL witryny Convex, sekrety brokera,
prefiks punktu końcowego, limit czasu HTTP oraz osiągalność admin/list bez drukowania
wartości sekretów. Użyj --json dla wyjścia czytelnego maszynowo w skryptach i narzędziach
CI.
Domyślny kontrakt punktu końcowego (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1):
POST /acquire- Żądanie:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Sukces:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Wyczerpane/możliwe do ponowienia:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Żądanie:
POST /payload-chunk- Żądanie:
{ kind, ownerId, actorRole, credentialId, leaseToken, index } - Sukces:
{ status: "ok", index, data }
- Żądanie:
POST /heartbeat- Żądanie:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Sukces:
{ status: "ok" }(lub puste2xx)
- Żądanie:
POST /release- Żądanie:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Sukces:
{ status: "ok" }(lub puste2xx)
- Żądanie:
POST /admin/add(tylko sekret maintainera)- Żądanie:
{ kind, actorId, payload, note?, status? } - Sukces:
{ status: "ok", credential }
- Żądanie:
POST /admin/remove(tylko sekret maintainera)- Żądanie:
{ credentialId, actorId } - Sukces:
{ status: "ok", changed, credential } - Ochrona aktywnej dzierżawy:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Żądanie:
POST /admin/list(tylko sekret maintainera)- Żądanie:
{ kind?, status?, includePayload?, limit? } - Sukces:
{ status: "ok", credentials, count }
- Żądanie:
{ groupId: string, driverToken: string, sutToken: string }groupIdmusi być numerycznym ciągiem identyfikatora czatu Telegram.admin/addwaliduje ten kształt dlakind: "telegram"i odrzuca zniekształcone payloady.
{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }groupId,testerUserIditelegramApiIdmuszą być numerycznymi ciągami.tdlibArchiveSha256idesktopTdataArchiveSha256muszą być ciągami hex SHA-256.kind: "telegram-user"reprezentuje jedno testowe konto Telegram. Traktuj dzierżawę jako obejmującą całe konto: sterownik CLI TDLib i wizualny świadek Telegram Desktop odtwarzają stan z tego samego payloadu, a dzierżawę powinno utrzymywać jednocześnie tylko jedno zadanie.
Telegram -workdir "$tmp/desktop", gdy potrzebne jest nagranie wizualne. W lokalnych środowiskach operatora scripts/e2e/telegram-user-credential.ts domyślnie odczytuje ~/.codex/skills/custom/telegram-e2e-bot-to-bot/convex.local.env, jeśli zmienne środowiskowe procesu są nieobecne.
Sesja Crabbox sterowana przez agenta:
start dzierżawi poświadczenie telegram-user, odtwarza to samo konto w
TDLib i Telegram Desktop na pulpicie Crabbox Linux, uruchamia lokalny mock SUT
gateway z bieżącego checkoutu, otwiera widoczny czat Telegram, rozpoczyna
nagrywanie pulpitu i zapisuje prywatny plik session.json. Gdy sesja jest
aktywna, agent może testować aż do uzyskania satysfakcjonującego wyniku:
send --session <file> --text <message>wysyła przez rzeczywistego użytkownika TDLib i czeka na odpowiedź SUT.run --session <file> -- <remote command>uruchamia dowolne polecenie w Crabbox i zapisuje jego wyjście, na przykładbash -lc 'source /tmp/openclaw-telegram-user-crabbox/env.sh && python3 /tmp/openclaw-telegram-user-crabbox/user-driver.py transcript --limit 20 --json'.screenshot --session <file>przechwytuje aktualnie widoczny pulpit.status --session <file>drukuje dzierżawę i polecenie WebVNC.finish --session <file>zatrzymuje rejestrator, przechwytuje zrzut ekranu/wideo/artefakty przycięte do ruchu, zwalnia poświadczenie Convex, zatrzymuje lokalne procesy SUT i zatrzymuje dzierżawę Crabbox, chyba że przekazano--keep-box.publish --session <file> --pr <number>domyślnie publikuje komentarz PR tylko z GIF-ami. Przekaż--full-artifactstylko wtedy, gdy logi lub artefakty JSON są celowo potrzebne.
--mock-response-file <path> do start
albo do skrótu jednopoleceniowego probe. Runner domyślnie używa standardowej
klasy Crabbox, nagrywania 24 kl./s, podglądów GIF ruchu 24 kl./s i szerokości GIF
1920 px. Nadpisuj za pomocą --class, --record-fps, --preview-fps i
--preview-width tylko wtedy, gdy dowód wymaga innych ustawień przechwytywania.
Jednopoleceniowy dowód Crabbox:
probe jest skrótem dla jednego cyklu start/send/finish. Użyj
go do szybkiego smoke /status. Użyj poleceń sesji do przeglądu PR,
odtwarzania błędów albo każdego przypadku, w którym agent potrzebuje kilku minut dowolnego
eksperymentowania przed uznaniem dowodu za kompletny. Użyj --id <cbx_...>, aby
ponownie użyć rozgrzanej dzierżawy pulpitu, --keep-box, aby pozostawić VNC otwarte po finish,
--desktop-chat-title <name>, aby wybrać widoczny czat, oraz --tdlib-url <tgz>,
gdy używasz wstępnie zbudowanego archiwum Linux libtdjson.so zamiast budować TDLib na
świeżym boksie. Runner weryfikuje --tdlib-url za pomocą --tdlib-sha256 <hex> albo,
domyślnie, sąsiedniego pliku <url>.sha256.
Payloady wielokanałowe walidowane przez brokera:
- Discord:
{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string } - WhatsApp:
{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }
{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }
dla wierszy Slack.
Dodawanie kanału do QA
Architektura i nazwy helperów scenariuszy dla nowych adapterów kanałów znajdują się w Przegląd QA → Dodawanie kanału. Minimalny próg: zaimplementuj runner transportu na współdzielonej seam hostaqa-lab, zadeklaruj qaRunners w manifeście Plugin, zamontuj jako openclaw qa <runner> i utwórz scenariusze w qa/scenarios/.
Zestawy testów (co uruchamia się gdzie)
Traktuj zestawy jako „rosnący realizm” (oraz rosnącą niestabilność/koszt):Unit / integracja (domyślnie)
- Polecenie:
pnpm test - Konfiguracja: nieukierunkowane uruchomienia używają zestawu shardów
vitest.full-*.config.tsi mogą rozszerzać shardy wieloprojektowe do konfiguracji per projekt na potrzeby harmonogramowania równoległego - Pliki: inwentarze core/unit w
src/**/*.test.ts,packages/**/*.test.tsitest/**/*.test.ts; testy jednostkowe UI działają w dedykowanym shardzieunit-ui - Zakres:
- Czyste testy jednostkowe
- Testy integracyjne w procesie (uwierzytelnianie gateway, routing, tooling, parsowanie, konfiguracja)
- Deterministyczne regresje dla znanych błędów
- Oczekiwania:
- Uruchamiane w CI
- Nie wymagają prawdziwych kluczy
- Powinny być szybkie i stabilne
- Testy resolvera i loadera powierzchni publicznej muszą potwierdzać szerokie zachowanie fallback
api.jsiruntime-api.jsz wygenerowanymi małymi fixture’ami Plugin, a nie z prawdziwymi API źródłowymi bundled Plugin. Rzeczywiste ładowania API Plugin należą do zestawów kontraktowych/integracyjnych należących do Plugin.
- Domyślne instalacje testowe pomijają opcjonalne natywne kompilacje opus dla Discord. Odbiór głosu Discord używa dekodera pure-JS
opusscript, a@discordjs/opuspozostaje wyłączony wallowBuilds, aby lokalne testy i ścieżki Testbox nie kompilowały natywnego dodatku. - Użyj dedykowanej ścieżki wydajności Discord voice albo ścieżki live, jeśli celowo musisz porównać natywną kompilację opus. Nie ustawiaj
@discordjs/opusnatruew domyślnymallowBuilds; sprawia to, że niepowiązane pętle instalacji/testów kompilują kod natywny.
Projects, shards, and scoped lanes
Projects, shards, and scoped lanes
- Nieukierunkowane
pnpm testuruchamia dwanaście mniejszych konfiguracji shardów (core-unit-fast,core-unit-src,core-unit-security,core-unit-ui,core-unit-support,core-support-boundary,core-contracts,core-bundled,core-runtime,agentic,auto-reply,extensions) zamiast jednego dużego natywnego procesu projektu głównego. Zmniejsza to szczytowe RSS na obciążonych maszynach i zapobiega zagłodzeniu niepowiązanych zestawów testów przez zadania auto-reply/extension. pnpm test --watchnadal używa natywnego głównego grafu projektówvitest.config.ts, ponieważ pętla watch z wieloma shardami nie jest praktyczna.pnpm test,pnpm test:watchipnpm test:perf:importskierują jawne cele plików/katalogów najpierw przez ścieżki zakresowe, dzięki czemupnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsunika pełnego kosztu startu projektu głównego.pnpm test:changeddomyślnie rozwija zmienione ścieżki git w tanie ścieżki zakresowe: bezpośrednie edycje testów, siostrzane pliki*.test.ts, jawne mapowania źródeł i lokalne zależności grafu importów. Edycje konfiguracji/setupu/pakietów nie uruchamiają szerokich testów, chyba że jawnie użyjeszOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed.pnpm check:changedto normalna inteligentna lokalna bramka sprawdzeń dla wąskich zmian. Klasyfikuje diff na core, testy core, plugins, testy Plugin, aplikacje, dokumentację, metadane wydania, narzędzia live Docker i tooling, a następnie uruchamia pasujące polecenia typecheck, lint i guard. Nie uruchamia testów Vitest; wywołajpnpm test:changedalbo jawnepnpm test <target>jako dowód testowy. Zmiany wersji dotyczące tylko metadanych wydania uruchamiają ukierunkowane sprawdzenia wersji/konfiguracji/zależności głównych, z guardem odrzucającym zmiany pakietów poza polem wersji najwyższego poziomu.- Edycje live Docker ACP harness uruchamiają ukierunkowane sprawdzenia: składnię shell dla skryptów uwierzytelniania live Docker oraz dry-run harmonogramu live Docker. Zmiany
package.jsonsą uwzględniane tylko wtedy, gdy diff ogranicza się doscripts["test:docker:live-*"]; edycje zależności, eksportów, wersji i innych powierzchni pakietu nadal używają szerszych guardów. - Lekkie importowo testy jednostkowe z agentów, poleceń, plugins, helperów auto-reply,
plugin-sdki podobnych czystych obszarów narzędziowych trafiają do ścieżkiunit-fast, która pomijatest/setup-openclaw-runtime.ts; pliki stanowe/runtime-heavy pozostają na istniejących ścieżkach. - Wybrane pliki źródłowe helperów
plugin-sdkicommandsrównież mapują uruchomienia w trybie changed na jawne siostrzane testy w tych lekkich ścieżkach, dzięki czemu edycje helperów unikają ponownego uruchamiania pełnego ciężkiego zestawu dla danego katalogu. auto-replyma dedykowane bucket’y dla helperów core najwyższego poziomu, integracyjnych testówreply.*najwyższego poziomu oraz poddrzewasrc/auto-reply/reply/**. CI dodatkowo dzieli poddrzewo reply na shardy agent-runner, dispatch oraz commands/state-routing, aby jeden import-heavy bucket nie obejmował całego ogona Node.- Normalne CI PR/main celowo pomija seryjny sweep plugins i shard
agentic-pluginstylko dla wydań. Pełna walidacja wydania uruchamia osobny podrzędny workflowPlugin Prereleasedla tych zestawów mocno obciążonych plugins/extensions na kandydatach wydania.
Embedded runner coverage
Embedded runner coverage
- Gdy zmieniasz dane wejściowe wykrywania message-tool albo kontekst runtime Compaction, zachowaj oba poziomy pokrycia.
- Dodaj ukierunkowane regresje helperów dla granic czystego routingu i normalizacji.
- Utrzymuj zestawy integracyjne embedded runner w dobrym stanie:
src/agents/pi-embedded-runner/compact.hooks.test.ts,src/agents/pi-embedded-runner/run.overflow-compaction.test.tsorazsrc/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts. - Te zestawy weryfikują, że identyfikatory zakresowe i zachowanie Compaction nadal przepływają
przez rzeczywiste ścieżki
run.ts/compact.ts; testy wyłącznie helperów nie są wystarczającym zamiennikiem tych ścieżek integracyjnych.
Vitest pool and isolation defaults
Vitest pool and isolation defaults
- Bazowa konfiguracja Vitest domyślnie używa
threads. - Współdzielona konfiguracja Vitest ustawia
isolate: falsei używa nieizolowanego runnera w projektach głównych, konfiguracjach e2e i live. - Główna ścieżka UI zachowuje swój setup
jsdomi optymalizator, ale również działa na współdzielonym nieizolowanym runnerze. - Każdy shard
pnpm testdziedziczy te same ustawienia domyślnethreads+isolate: falseze współdzielonej konfiguracji Vitest. scripts/run-vitest.mjsdomyślnie dodaje--no-maglevdla procesów potomnych Node Vitest, aby ograniczyć narzut kompilacji V8 podczas dużych lokalnych uruchomień. UstawOPENCLAW_VITEST_ENABLE_MAGLEV=1, aby porównać ze standardowym zachowaniem V8.
Fast local iteration
Fast local iteration
pnpm changed:lanespokazuje, które ścieżki architektoniczne uruchamia diff.- Hook pre-commit wykonuje tylko formatowanie. Ponownie stage’uje sformatowane pliki i nie uruchamia lint, typecheck ani testów.
- Uruchom jawnie
pnpm check:changedprzed przekazaniem albo wypchnięciem, gdy potrzebujesz inteligentnej lokalnej bramki sprawdzeń. pnpm test:changeddomyślnie kieruje przez tanie ścieżki zakresowe. UżywajOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedtylko wtedy, gdy agent uzna, że edycja harnessa, konfiguracji, pakietu albo kontraktu naprawdę wymaga szerszego pokrycia Vitest.pnpm test:maxipnpm test:changed:maxzachowują to samo zachowanie routingu, tylko z wyższym limitem workerów.- Lokalne automatyczne skalowanie workerów jest celowo konserwatywne i wycofuje się, gdy średnie obciążenie hosta jest już wysokie, więc wiele równoczesnych uruchomień Vitest domyślnie powoduje mniej szkód.
- Bazowa konfiguracja Vitest oznacza projekty/pliki konfiguracji jako
forceRerunTriggers, aby ponowne uruchomienia w trybie changed pozostały poprawne, gdy zmienia się okablowanie testów. - Konfiguracja utrzymuje
OPENCLAW_VITEST_FS_MODULE_CACHEwłączone na obsługiwanych hostach; ustawOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path, jeśli chcesz jedną jawną lokalizację cache do bezpośredniego profilowania.
Perf debugging
Perf debugging
pnpm test:perf:importswłącza raportowanie czasu trwania importów Vitest oraz dane wyjściowe import-breakdown.pnpm test:perf:imports:changedzawęża ten sam widok profilowania do plików zmienionych odorigin/main.- Dane czasów shardów są zapisywane do
.artifacts/vitest-shard-timings.json. Uruchomienia całej konfiguracji używają ścieżki konfiguracji jako klucza; shardy CI z include-pattern dopisują nazwę sharda, aby filtrowane shardy można było śledzić osobno. - Gdy jeden gorący test nadal spędza większość czasu na importach startowych,
trzymaj ciężkie zależności za wąską lokalną granicą
*.runtime.tsi mockuj tę granicę bezpośrednio, zamiast głęboko importować helpery runtime tylko po to, by przekazać je przezvi.mock(...). pnpm test:perf:changed:bench -- --ref <git-ref>porównuje routowanetest:changedz natywną ścieżką projektu głównego dla tego zatwierdzonego diffu i wypisuje czas ścienny oraz maksymalne RSS na macOS.pnpm test:perf:changed:bench -- --worktreebenchmarkuje bieżące brudne drzewo, kierując listę zmienionych plików przezscripts/test-projects.mjsi główną konfigurację Vitest.pnpm test:perf:profile:mainzapisuje profil CPU głównego wątku dla narzutu startu i transformacji Vitest/Vite.pnpm test:perf:profile:runnerzapisuje profile CPU+heap runnera dla zestawu jednostkowego z wyłączoną równoległością plików.
Stabilność (Gateway)
- Polecenie:
pnpm test:stability:gateway - Konfiguracja:
vitest.gateway.config.ts, wymuszona na jednego workera - Zakres:
- Uruchamia rzeczywisty loopback Gateway z diagnostyką włączoną domyślnie
- Przepuszcza syntetyczne obciążenie wiadomości Gateway, pamięci i dużych payloadów przez ścieżkę zdarzeń diagnostycznych
- Odpytuje
diagnostics.stabilityprzez Gateway WS RPC - Obejmuje helpery utrwalania pakietu stabilności diagnostycznej
- Sprawdza, że rejestrator pozostaje ograniczony, syntetyczne próbki RSS mieszczą się w budżecie presji, a głębokości kolejek per sesja wracają do zera
- Oczekiwania:
- Bezpieczne dla CI i bez kluczy
- Wąska ścieżka do follow-upów regresji stabilności, nie zamiennik pełnego zestawu Gateway
E2E (smoke test Gateway)
- Polecenie:
pnpm test:e2e - Konfiguracja:
vitest.e2e.config.ts - Pliki:
src/**/*.e2e.test.ts,test/**/*.e2e.test.tsoraz testy E2E bundled-plugin podextensions/ - Domyślne ustawienia runtime:
- Używa Vitest
threadszisolate: false, zgodnie z resztą repo. - Używa adaptacyjnych workerów (CI: do 2, lokalnie: domyślnie 1).
- Domyślnie działa w trybie silent, aby ograniczyć narzut I/O konsoli.
- Używa Vitest
- Przydatne nadpisania:
OPENCLAW_E2E_WORKERS=<n>, aby wymusić liczbę workerów (limit 16).OPENCLAW_E2E_VERBOSE=1, aby ponownie włączyć szczegółowe wyjście konsoli.
- Zakres:
- Zachowanie end-to-end Gateway z wieloma instancjami
- Powierzchnie WebSocket/HTTP, parowanie Node i cięższe sieciowanie
- Oczekiwania:
- Działa w CI (gdy jest włączone w pipeline)
- Nie wymaga prawdziwych kluczy
- Więcej ruchomych części niż testy jednostkowe (może być wolniejsze)
E2E: smoke test backendu OpenShell
- Polecenie:
pnpm test:e2e:openshell - Plik:
extensions/openshell/src/backend.e2e.test.ts - Zakres:
- Uruchamia izolowany Gateway OpenShell na hoście przez Docker
- Tworzy piaskownicę z tymczasowego lokalnego Dockerfile
- Testuje backend OpenShell OpenClaw przez rzeczywiste
sandbox ssh-config+ wykonanie SSH - Weryfikuje zachowanie zdalnie kanonicznego systemu plików przez most sandbox fs
- Oczekiwania:
- Tylko opt-in; nie jest częścią domyślnego uruchomienia
pnpm test:e2e - Wymaga lokalnego CLI
openshelloraz działającego demona Docker - Używa izolowanych
HOME/XDG_CONFIG_HOME, a następnie niszczy testowy Gateway i piaskownicę
- Tylko opt-in; nie jest częścią domyślnego uruchomienia
- Przydatne nadpisania:
OPENCLAW_E2E_OPENSHELL=1, aby włączyć test podczas ręcznego uruchamiania szerszego zestawu e2eOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell, aby wskazać niestandardowy binarny CLI albo skrypt wrappera
Live (prawdziwi dostawcy + prawdziwe modele)
- Polecenie:
pnpm test:live - Konfiguracja:
vitest.live.config.ts - Pliki:
src/**/*.live.test.ts,test/**/*.live.test.tsoraz testy live dołączonych pluginów wextensions/ - Domyślnie: włączone przez
pnpm test:live(ustawiaOPENCLAW_LIVE_TEST=1) - Zakres:
- „Czy ten dostawca/model faktycznie działa dzisiaj z prawdziwymi danymi uwierzytelniającymi?”
- Wykrywanie zmian formatu dostawcy, osobliwości wywoływania narzędzi, problemów z uwierzytelnianiem i zachowania limitów szybkości
- Oczekiwania:
- Z założenia nie jest stabilne dla CI (prawdziwe sieci, prawdziwe zasady dostawców, limity, awarie)
- Kosztuje pieniądze / zużywa limity szybkości
- Preferuj uruchamianie zawężonych podzbiorów zamiast „wszystkiego”
- Uruchomienia live wczytują
~/.profile, aby pobrać brakujące klucze API. - Domyślnie uruchomienia live nadal izolują
HOMEi kopiują materiały konfiguracyjne/uwierzytelniające do tymczasowego katalogu domowego testu, aby fixtury jednostkowe nie mogły zmodyfikować Twojego prawdziwego~/.openclaw. - Ustaw
OPENCLAW_LIVE_USE_REAL_HOME=1tylko wtedy, gdy celowo potrzebujesz, aby testy live używały Twojego prawdziwego katalogu domowego. pnpm test:livedomyślnie działa teraz w cichszym trybie: zachowuje wyjście postępu[live] ..., ale ukrywa dodatkową informację o~/.profilei wycisza logi startowe gatewaya/szum Bonjour. UstawOPENCLAW_LIVE_TEST_QUIET=0, jeśli chcesz przywrócić pełne logi uruchamiania.- Rotacja kluczy API (specyficzna dla dostawcy): ustaw
*_API_KEYSz formatem rozdzielanym przecinkami/średnikami albo*_API_KEY_1,*_API_KEY_2(na przykładOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) albo nadpisanie dla live przezOPENCLAW_LIVE_*_KEY; testy ponawiają próbę przy odpowiedziach limitu szybkości. - Wyjście postępu/Heartbeat:
- Pakiety live emitują teraz wiersze postępu do stderr, dzięki czemu długie wywołania dostawców są widocznie aktywne nawet wtedy, gdy przechwytywanie konsoli Vitest jest ciche.
vitest.live.config.tswyłącza przechwytywanie konsoli Vitest, aby wiersze postępu dostawcy/gatewaya były strumieniowane natychmiast podczas uruchomień live.- Dostrój Heartbeat bezpośredniego modelu za pomocą
OPENCLAW_LIVE_HEARTBEAT_MS. - Dostrój Heartbeat gatewaya/probe za pomocą
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Który pakiet mam uruchomić?
Użyj tej tabeli decyzyjnej:- Edycja logiki/testów: uruchom
pnpm test(orazpnpm test:coverage, jeśli zmieniono dużo) - Dotykanie sieci Gateway / protokołu WS / parowania: dodaj
pnpm test:e2e - Debugowanie „mój bot nie działa” / awarii specyficznych dla dostawcy / wywoływania narzędzi: uruchom zawężone
pnpm test:live
Testy live (dotykające sieci)
Informacje o macierzy modeli live, testach dymnych backendu CLI, testach dymnych ACP, uprzęży serwera aplikacji Codex oraz wszystkich testach live dostawców mediów (Deepgram, BytePlus, ComfyUI, obraz, muzyka, wideo, uprząż mediów) — a także o obsłudze danych uwierzytelniających dla uruchomień live — znajdziesz w Testowanie pakietów live. Dedykowaną listę kontrolną aktualizacji i walidacji pluginów znajdziesz w Testowanie aktualizacji i pluginów.Runnery Docker (opcjonalne sprawdzenia „czy działa w Linuksie”)
Te runnery Docker dzielą się na dwie grupy:- Runnery modeli live:
test:docker:live-modelsitest:docker:live-gatewayuruchamiają tylko odpowiadający im plik live z kluczami profili wewnątrz obrazu Docker repozytorium (src/agents/models.profiles.live.test.tsisrc/gateway/gateway-models.profiles.live.test.ts), montując lokalny katalog konfiguracji i workspace (oraz wczytując~/.profile, jeśli jest zamontowany). Odpowiadające lokalne punkty wejścia totest:live:models-profilesitest:live:gateway-profiles. - Runnery Docker live domyślnie używają mniejszego limitu testów dymnych, aby pełny przebieg Docker pozostał praktyczny:
test:docker:live-modelsdomyślnie ustawiaOPENCLAW_LIVE_MAX_MODELS=12, atest:docker:live-gatewaydomyślnie ustawiaOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000orazOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Nadpisz te zmienne środowiskowe, gdy wyraźnie chcesz większy, wyczerpujący skan. test:docker:allbuduje obraz Docker live raz przeztest:docker:live-build, pakuje OpenClaw raz jako tarball npm przezscripts/package-openclaw-for-docker.mjs, a następnie buduje/ponownie używa dwóch obrazówscripts/e2e/Dockerfile. Obraz bazowy jest tylko runnerem Node/Git dla ścieżek instalacji/aktualizacji/zależności pluginów; te ścieżki montują wstępnie zbudowany tarball. Obraz funkcjonalny instaluje ten sam tarball w/appdla ścieżek funkcjonalności zbudowanej aplikacji. Definicje ścieżek Docker znajdują się wscripts/lib/docker-e2e-scenarios.mjs; logika planera znajduje się wscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjswykonuje wybrany plan. Agregat używa ważonego lokalnego harmonogramu:OPENCLAW_DOCKER_ALL_PARALLELISMkontroluje sloty procesów, a limity zasobów powstrzymują ciężkie ścieżki live, instalacji npm i wielousługowe przed jednoczesnym startem. Jeśli pojedyncza ścieżka jest cięższa niż aktywne limity, harmonogram nadal może ją uruchomić, gdy pula jest pusta, a potem utrzymuje ją jako jedyną działającą do czasu ponownej dostępności pojemności. Domyślne wartości to 10 slotów,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10iOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; dostrajajOPENCLAW_DOCKER_ALL_WEIGHT_LIMITlubOPENCLAW_DOCKER_ALL_DOCKER_LIMITtylko wtedy, gdy host Docker ma większy zapas. Runner domyślnie wykonuje preflight Docker, usuwa nieaktualne kontenery OpenClaw E2E, wypisuje status co 30 sekund, zapisuje czasy udanych ścieżek w.artifacts/docker-tests/lane-timings.jsoni używa tych czasów, aby przy późniejszych uruchomieniach zaczynać od dłuższych ścieżek. UżyjOPENCLAW_DOCKER_ALL_DRY_RUN=1, aby wypisać ważony manifest ścieżek bez budowania ani uruchamiania Docker, albonode scripts/test-docker-all.mjs --plan-json, aby wypisać plan CI dla wybranych ścieżek, potrzeb pakietu/obrazu i danych uwierzytelniających.Package Acceptanceto natywna dla GitHub bramka pakietu sprawdzająca „czy ten instalowalny tarball działa jako produkt?”. Rozwiązuje jeden pakiet kandydujący zsource=npm,source=ref,source=urlalbosource=artifact, przesyła go jakopackage-under-test, a następnie uruchamia wielokrotnego użytku ścieżki Docker E2E wobec dokładnie tego tarballa zamiast ponownie pakować wybrany ref. Profile są uporządkowane według szerokości:smoke,package,productifull. Zobacz Testowanie aktualizacji i pluginów, aby poznać kontrakt pakietu/aktualizacji/pluginu, macierz przetrwania opublikowanych aktualizacji, domyślne ustawienia wydań i triage awarii.- Kontrole kompilacji i wydania uruchamiają
scripts/check-cli-bootstrap-imports.mjspo tsdown. Strażnik przechodzi po statycznym zbudowanym grafie oddist/entry.jsidist/cli/run-main.jsi kończy się niepowodzeniem, jeśli start przed dyspozycją importuje zależności pakietów, takie jak Commander, UI promptów, undici albo logowanie, przed dyspozycją polecenia; utrzymuje też dołączony fragment uruchamiania Gateway poniżej budżetu i odrzuca statyczne importy znanych zimnych ścieżek Gateway. Test dymny spakowanego CLI obejmuje także pomoc główną, pomoc onboard, pomoc doctor, status, schemat konfiguracji i polecenie listy modeli. - Zgodność wsteczna Package Acceptance jest ograniczona do
2026.4.25(w tym2026.4.25-beta.*). Do tego punktu granicznego uprząż toleruje tylko luki metadanych wysłanych pakietów: pominięte prywatne wpisy inwentarza QA, brakgateway install --wrapper, brakujące pliki łatek w fixturze git pochodzącej z tarballa, brak utrwalonegoupdate.channel, starsze lokalizacje rekordów instalacji pluginów, brak utrwalania rekordów instalacji marketplace oraz migrację metadanych konfiguracji podczasplugins update. Dla pakietów po2026.4.25te ścieżki są ścisłymi awariami. - Runnery testów dymnych kontenerów:
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,test:docker:skill-install,test:docker:update-channel-switch,test:docker:upgrade-survivor,test:docker:published-upgrade-survivor,test:docker:session-runtime-context,test:docker:agents-delete-shared-workspace,test:docker:gateway-network,test:docker:browser-cdp-snapshot,test:docker:mcp-channels,test:docker:pi-bundle-mcp-tools,test:docker:cron-mcp-cleanup,test:docker:plugins,test:docker:plugin-update,test:docker:plugin-lifecycle-matrixitest:docker:config-reloaduruchamiają co najmniej jeden prawdziwy kontener i weryfikują ścieżki integracji wyższego poziomu.
- Modele bezpośrednie:
pnpm test:docker:live-models(skrypt:scripts/test-live-models-docker.sh) - Smoke test wiązania ACP:
pnpm test:docker:live-acp-bind(skrypt:scripts/test-live-acp-bind-docker.sh; domyślnie obejmuje Claude, Codex i Gemini, ze ścisłym pokryciem Droid/OpenCode przezpnpm test:docker:live-acp-bind:droidipnpm test:docker:live-acp-bind:opencode) - Smoke test backendu CLI:
pnpm test:docker:live-cli-backend(skrypt:scripts/test-live-cli-backend-docker.sh) - Smoke test uprzęży serwera aplikacji Codex:
pnpm test:docker:live-codex-harness(skrypt:scripts/test-live-codex-harness-docker.sh) - Gateway + agent deweloperski:
pnpm test:docker:live-gateway(skrypt:scripts/test-live-gateway-models-docker.sh) - Smoke test obserwowalności:
pnpm qa:otel:smoketo prywatna ścieżka QA dla checkoutu źródeł. Celowo nie jest częścią ścieżek wydań pakietów Docker, ponieważ tarball npm pomija QA Lab. - Smoke test Open WebUI na żywo:
pnpm test:docker:openwebui(skrypt:scripts/e2e/openwebui-docker.sh) - Kreator onboardingu (TTY, pełne szkieletowanie):
pnpm test:docker:onboard(skrypt:scripts/e2e/onboard-docker.sh) - Smoke test onboardingu/kanału/agenta z tarballa npm:
pnpm test:docker:npm-onboard-channel-agentinstaluje spakowany tarball OpenClaw globalnie w Docker, konfiguruje OpenAI przez onboarding z referencją env oraz domyślnie Telegram, uruchamia doctor i wykonuje jedną zamockowaną turę agenta OpenAI. Użyj ponownie wcześniej zbudowanego tarballa zOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz, pomiń przebudowę hosta za pomocąOPENCLAW_NPM_ONBOARD_HOST_BUILD=0albo zmień kanał przezOPENCLAW_NPM_ONBOARD_CHANNEL=discordlubOPENCLAW_NPM_ONBOARD_CHANNEL=slack. - Smoke test instalacji Skills:
pnpm test:docker:skill-installinstaluje spakowany tarball OpenClaw globalnie w Docker, wyłącza w konfiguracji instalacje przesłanych archiwów, rozwiązuje bieżący slug Skills ClawHub na żywo z wyszukiwania, instaluje go za pomocąopenclaw skills installi weryfikuje zainstalowane Skills oraz metadane pochodzenia/blokady.clawhub. - Smoke test przełączania kanału aktualizacji:
pnpm test:docker:update-channel-switchinstaluje spakowany tarball OpenClaw globalnie w Docker, przełącza z pakietustablena gitdev, weryfikuje utrwalony kanał i działanie Plugin po aktualizacji, a następnie przełącza z powrotem na pakietstablei sprawdza status aktualizacji. - Smoke test przetrwania aktualizacji:
pnpm test:docker:upgrade-survivorinstaluje spakowany tarball OpenClaw na brudnej fiksturze starego użytkownika z agentami, konfiguracją kanałów, listami dozwolonych Plugin, nieaktualnym stanem zależności Plugin oraz istniejącymi plikami workspace/sesji. Uruchamia aktualizację pakietu oraz nieinteraktywny doctor bez kluczy dostawcy na żywo ani kanału, następnie uruchamia Gateway loopback i sprawdza zachowanie konfiguracji/stanu oraz budżety uruchomienia/statusu. - Smoke test przetrwania opublikowanej aktualizacji:
pnpm test:docker:published-upgrade-survivordomyślnie instalujeopenclaw@latest, zasila realistyczne pliki istniejącego użytkownika, konfiguruje tę bazę za pomocą wbudowanej receptury poleceń, waliduje wynikową konfigurację, aktualizuje tę opublikowaną instalację do tarballa kandydata, uruchamia nieinteraktywny doctor, zapisuje.artifacts/upgrade-survivor/summary.json, następnie uruchamia Gateway loopback i sprawdza skonfigurowane intencje, zachowanie stanu, uruchomienie,/healthz,/readyzoraz budżety statusu RPC. Nadpisz jedną bazę za pomocąOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, poproś agregujący harmonogram o rozwinięcie dokładnych lokalnych baz przezOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS, takich jakopenclaw@2026.5.2 openclaw@2026.4.23 openclaw@2026.4.15, i rozwiń fikstury w kształcie zgłoszeń przezOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS, takie jakreported-issues; zestaw reported-issues obejmujeconfigured-plugin-installsdo automatycznej naprawy instalacji zewnętrznych Plugin OpenClaw. Package Acceptance udostępnia je jakopublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesipublished_upgrade_survivor_scenarios, rozwiązuje metatokeny baz, takie jaklast-stable-4luball-since-2026.4.23, a Full Release Validation rozszerza bramkę pakietu release-soak dolast-stable-4 2026.4.23 2026.5.2 2026.4.15orazreported-issues. - Smoke test kontekstu runtime sesji:
pnpm test:docker:session-runtime-contextweryfikuje utrwalanie transkryptu ukrytego kontekstu runtime oraz naprawę doctor dla dotkniętych zduplikowanych gałęzi przepisywania promptów. - Smoke test globalnej instalacji Bun:
bash scripts/e2e/bun-global-install-smoke.shpakuje bieżące drzewo, instaluje je za pomocąbun install -gw izolowanym home i weryfikuje, żeopenclaw infer image providers --jsonzwraca dołączonych dostawców obrazów zamiast się zawieszać. Użyj ponownie wcześniej zbudowanego tarballa zOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz, pomiń build hosta przezOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0albo skopiujdist/ze zbudowanego obrazu Docker przezOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. - Smoke test instalatora Docker:
bash scripts/test-install-sh-docker.shwspółdzieli jedną pamięć podręczną npm między kontenerami root, update i direct-npm. Smoke test aktualizacji domyślnie używa npmlatestjako stabilnej bazy przed aktualizacją do tarballa kandydata. Nadpisz lokalnie za pomocąOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22albo wejściemupdate_baseline_versionworkflow Install Smoke na GitHub. Kontrole instalatora bez roota zachowują izolowaną pamięć podręczną npm, aby wpisy cache należące do roota nie maskowały zachowania lokalnej instalacji użytkownika. UstawOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache, aby ponownie używać cache root/update/direct-npm przy lokalnych ponownych uruchomieniach. - Install Smoke CI pomija zduplikowaną bezpośrednią globalną aktualizację npm za pomocą
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; uruchom skrypt lokalnie bez tego env, gdy potrzebne jest pokrycie bezpośredniegonpm install -g. - Smoke test CLI usuwania współdzielonego workspace agentów:
pnpm test:docker:agents-delete-shared-workspace(skrypt:scripts/e2e/agents-delete-shared-workspace-docker.sh) domyślnie buduje obraz z głównego Dockerfile, zasila dwóch agentów jednym workspace w izolowanym home kontenera, uruchamiaagents delete --jsoni weryfikuje poprawny JSON oraz zachowanie zachowanego workspace. Użyj ponownie obrazu install-smoke za pomocąOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1. - Sieć Gateway (dwa kontenery, uwierzytelnianie WS + health):
pnpm test:docker:gateway-network(skrypt:scripts/e2e/gateway-network-docker.sh) - Smoke test zrzutu CDP przeglądarki:
pnpm test:docker:browser-cdp-snapshot(skrypt:scripts/e2e/browser-cdp-snapshot-docker.sh) buduje źródłowy obraz E2E oraz warstwę Chromium, uruchamia Chromium z surowym CDP, uruchamiabrowser doctor --deepi weryfikuje, że zrzuty ról CDP obejmują URL-e linków, klikalne elementy promowane kursorem, referencje iframe i metadane ramek. - Regresja minimalnego rozumowania OpenAI Responses web_search:
pnpm test:docker:openai-web-search-minimal(skrypt:scripts/e2e/openai-web-search-minimal-docker.sh) uruchamia zamockowany serwer OpenAI przez Gateway, weryfikuje, żeweb_searchpodnosireasoning.effortzminimaldolow, następnie wymusza odrzucenie schematu dostawcy i sprawdza, że surowy szczegół pojawia się w logach Gateway. - Most kanału MCP (zasiany Gateway + most stdio + surowy smoke test ramki powiadomienia Claude):
pnpm test:docker:mcp-channels(skrypt:scripts/e2e/mcp-channels-docker.sh) - Narzędzia MCP pakietu Pi (rzeczywisty serwer MCP stdio + smoke test allow/deny osadzonego profilu Pi):
pnpm test:docker:pi-bundle-mcp-tools(skrypt:scripts/e2e/pi-bundle-mcp-tools-docker.sh) - Czyszczenie MCP Cron/subagenta (rzeczywisty Gateway + porządkowanie procesu potomnego MCP stdio po izolowanych uruchomieniach cron i jednorazowego subagenta):
pnpm test:docker:cron-mcp-cleanup(skrypt:scripts/e2e/cron-mcp-cleanup-docker.sh) - Pluginy (smoke test instalacji/aktualizacji dla ścieżki lokalnej,
file:, rejestru npm z wyniesionymi zależnościami, ruchomych refów git, kitchen-sink ClawHub, aktualizacji marketplace oraz włączenia/inspekcji pakietu Claude):pnpm test:docker:plugins(skrypt:scripts/e2e/plugins-docker.sh) UstawOPENCLAW_PLUGINS_E2E_CLAWHUB=0, aby pominąć blok ClawHub, albo nadpisz domyślną parę pakiet/runtime kitchen-sink przezOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECiOPENCLAW_PLUGINS_E2E_CLAWHUB_ID. BezOPENCLAW_CLAWHUB_URL/CLAWHUB_URLtest używa hermetycznego lokalnego serwera fikstur ClawHub. - Smoke test niezmienionej aktualizacji Plugin:
pnpm test:docker:plugin-update(skrypt:scripts/e2e/plugin-update-unchanged-docker.sh) - Smoke test macierzy cyklu życia Plugin:
pnpm test:docker:plugin-lifecycle-matrixinstaluje spakowany tarball OpenClaw w gołym kontenerze, instaluje Plugin npm, przełącza włączenie/wyłączenie, aktualizuje go i obniża jego wersję przez lokalny rejestr npm, usuwa zainstalowany kod, a następnie weryfikuje, że odinstalowanie nadal usuwa nieaktualny stan, logując metryki RSS/CPU dla każdej fazy cyklu życia. - Smoke test metadanych przeładowania konfiguracji:
pnpm test:docker:config-reload(skrypt:scripts/e2e/config-reload-source-docker.sh) - Pluginy:
pnpm test:docker:pluginsobejmuje smoke test instalacji/aktualizacji dla ścieżki lokalnej,file:, rejestru npm z wyniesionymi zależnościami, ruchomych refów git, fikstur ClawHub, aktualizacji marketplace oraz włączenia/inspekcji pakietu Claude.pnpm test:docker:plugin-updateobejmuje zachowanie niezmienionej aktualizacji dla zainstalowanych Plugin.pnpm test:docker:plugin-lifecycle-matrixobejmuje śledzone zasobowo instalowanie, włączanie, wyłączanie, aktualizowanie, obniżanie wersji i odinstalowanie przy brakującym kodzie Plugin npm.
OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE, nadal mają pierwszeństwo, gdy są ustawione. Gdy OPENCLAW_SKIP_DOCKER_BUILD=1 wskazuje na zdalny współdzielony obraz, skrypty pobierają go, jeśli nie jest jeszcze lokalny. Testy QR i instalatora Docker zachowują własne Dockerfile, ponieważ walidują zachowanie pakietu/instalacji, a nie współdzielony runtime zbudowanej aplikacji.
Runnery Docker live-modeli montują też bieżący checkout tylko do odczytu i
przygotowują go w tymczasowym katalogu roboczym wewnątrz kontenera. Dzięki temu obraz
runtime pozostaje niewielki, a Vitest nadal działa na dokładnie Twoim lokalnym źródle/konfiguracji.
Krok przygotowania pomija duże, wyłącznie lokalne pamięci podręczne i wyjścia buildów aplikacji, takie jak
.pnpm-store, .worktrees, __openclaw_vitest__ oraz lokalne dla aplikacji katalogi wyjściowe .build lub
Gradle, aby uruchomienia live w Dockerze nie traciły minut na kopiowanie
artefaktów specyficznych dla maszyny.
Ustawiają też OPENCLAW_SKIP_CHANNELS=1, aby sondy live Gateway nie uruchamiały
prawdziwych workerów kanałów Telegram/Discord/itd. wewnątrz kontenera.
test:docker:live-models nadal uruchamia pnpm test:live, więc przekazuj również
OPENCLAW_LIVE_GATEWAY_*, gdy musisz zawęzić lub wykluczyć pokrycie live Gateway
z tej ścieżki Docker.
test:docker:openwebui to wyższego poziomu smoke test zgodności: uruchamia
kontener Gateway OpenClaw z włączonymi endpointami HTTP zgodnymi z OpenAI,
uruchamia przypięty kontener Open WebUI względem tego Gateway, loguje się przez
Open WebUI, weryfikuje, że /api/models udostępnia openclaw/default, a następnie wysyła
prawdziwe żądanie czatu przez proxy /api/chat/completions Open WebUI.
Ustaw OPENWEBUI_SMOKE_MODE=models dla kontroli CI w ścieżce wydania, które powinny zatrzymać się
po logowaniu do Open WebUI i wykryciu modelu, bez czekania na ukończenie live modelu.
Pierwsze uruchomienie może być zauważalnie wolniejsze, ponieważ Docker może musieć pobrać
obraz Open WebUI, a Open WebUI może musieć dokończyć własną konfigurację zimnego startu.
Ta ścieżka oczekuje używalnego klucza live modelu, a OPENCLAW_PROFILE_FILE
(domyślnie ~/.profile) jest głównym sposobem jego podania w uruchomieniach w Dockerze.
Udane uruchomienia wypisują mały payload JSON, taki jak { "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels jest celowo deterministyczny i nie wymaga
prawdziwego konta Telegram, Discord ani iMessage. Uruchamia zaszczepiony kontener
Gateway, startuje drugi kontener, który spawnuję openclaw mcp serve, a następnie
weryfikuje routowane wykrywanie konwersacji, odczyty transkrypcji, metadane załączników,
zachowanie kolejki zdarzeń live, routing wysyłki wychodzącej oraz powiadomienia kanałów +
uprawnień w stylu Claude przez prawdziwy most stdio MCP. Kontrola powiadomień
bezpośrednio sprawdza surowe ramki stdio MCP, więc smoke test waliduje to, co
most faktycznie emituje, a nie tylko to, co akurat pokazuje konkretny SDK klienta.
test:docker:pi-bundle-mcp-tools jest deterministyczny i nie wymaga klucza live modelu.
Buduje obraz Docker repozytorium, uruchamia prawdziwy serwer sondy stdio MCP
wewnątrz kontenera, materializuje ten serwer przez wbudowany runtime MCP pakietu Pi,
wykonuje narzędzie, a następnie weryfikuje, że coding i messaging zachowują
narzędzia bundle-mcp, podczas gdy minimal oraz tools.deny: ["bundle-mcp"] je filtrują.
test:docker:cron-mcp-cleanup jest deterministyczny i nie wymaga klucza live modelu.
Uruchamia zaszczepiony Gateway z prawdziwym serwerem sondy stdio MCP, wykonuje
izolowaną turę cron oraz jednorazową turę potomną /subagents spawn, a następnie weryfikuje,
że proces potomny MCP kończy działanie po każdym uruchomieniu.
Ręczny smoke test wątku ACP w języku naturalnym (nie CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Zachowaj ten skrypt dla workflow regresji/debugowania. Może być ponownie potrzebny do walidacji routingu wątków ACP, więc go nie usuwaj.
OPENCLAW_CONFIG_DIR=...(domyślnie:~/.openclaw) montowane do/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(domyślnie:~/.openclaw/workspace) montowane do/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...(domyślnie:~/.profile) montowane do/home/node/.profilei wczytywane przed uruchomieniem testówOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1aby zweryfikować tylko zmienne środowiskowe wczytane zOPENCLAW_PROFILE_FILE, używając tymczasowych katalogów konfiguracji/workspace i bez zewnętrznych montowań auth CLIOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(domyślnie:~/.cache/openclaw/docker-cli-tools) montowane do/home/node/.npm-globaldla cache’owanych instalacji CLI wewnątrz Dockera- Zewnętrzne katalogi/pliki auth CLI pod
$HOMEsą montowane tylko do odczytu pod/host-auth..., a następnie kopiowane do/home/node/...przed startem testów- Domyślne katalogi:
.minimax - Domyślne pliki:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Zawężone uruchomienia providerów montują tylko potrzebne katalogi/pliki wywnioskowane z
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Nadpisz ręcznie za pomocą
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=nonelub listy rozdzielonej przecinkami, takiej jakOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Domyślne katalogi:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...aby zawęzić uruchomienieOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...aby filtrować providerów w kontenerzeOPENCLAW_SKIP_DOCKER_BUILD=1aby ponownie użyć istniejącego obrazuopenclaw:local-livedla ponownych uruchomień, które nie wymagają rebuilduOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1aby zapewnić, że dane uwierzytelniające pochodzą z magazynu profilu (nie z env)OPENCLAW_OPENWEBUI_MODEL=...aby wybrać model udostępniany przez Gateway dla smoke testu Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...aby nadpisać prompt kontroli nonce używany przez smoke test Open WebUIOPENWEBUI_IMAGE=...aby nadpisać przypięty tag obrazu Open WebUI
Kontrola poprawności dokumentacji
Uruchom kontrole dokumentacji po edycjach docs:pnpm check:docs.
Uruchom pełną walidację anchorów Mintlify, gdy potrzebujesz także kontroli nagłówków na stronie: pnpm docs:check-links:anchors.
Regresja offline (bezpieczna dla CI)
To są regresje „prawdziwego pipeline’u” bez prawdziwych providerów:- Wywoływanie narzędzi Gateway (mock OpenAI, prawdziwy gateway + pętla agenta):
src/gateway/gateway.test.ts(przypadek: “runs a mock OpenAI tool call end-to-end via gateway agent loop”) - Kreator Gateway (WS
wizard.start/wizard.next, zapisuje konfigurację + wymuszone auth):src/gateway/gateway.test.ts(przypadek: “runs wizard over ws and writes auth token config”)
Ewaluacje niezawodności agentów (skills)
Mamy już kilka testów bezpiecznych dla CI, które zachowują się jak „ewaluacje niezawodności agentów”:- Mockowe wywoływanie narzędzi przez prawdziwy gateway + pętlę agenta (
src/gateway/gateway.test.ts). - Przepływy kreatora end-to-end, które walidują połączenia sesji i efekty konfiguracji (
src/gateway/gateway.test.ts).
- Podejmowanie decyzji: gdy skills są wymienione w prompcie, czy agent wybiera właściwy skill (albo unika nieistotnych)?
- Zgodność: czy agent czyta
SKILL.mdprzed użyciem i wykonuje wymagane kroki/argumenty? - Kontrakty workflow: scenariusze wieloturowe, które asertują kolejność narzędzi, przeniesienie historii sesji i granice sandboxa.
- Runner scenariuszy używający mockowych providerów do asercji wywołań narzędzi + kolejności, odczytów plików skill i połączeń sesji.
- Mały zestaw scenariuszy skupionych na skillach (użyj vs unikaj, bramkowanie, prompt injection).
- Opcjonalne ewaluacje live (opt-in, bramkowane env) dopiero po wdrożeniu zestawu bezpiecznego dla CI.
Testy kontraktowe (kształt pluginu i kanału)
Testy kontraktowe weryfikują, że każdy zarejestrowany plugin i kanał jest zgodny ze swoim kontraktem interfejsu. Iterują po wszystkich wykrytych pluginach i uruchamiają zestaw asercji kształtu i zachowania. Domyślna ścieżka jednostkowapnpm test celowo
pomija te współdzielone pliki seams i smoke; uruchamiaj komendy kontraktowe jawnie,
gdy dotykasz współdzielonych powierzchni kanału lub providera.
Komendy
- Wszystkie kontrakty:
pnpm test:contracts - Tylko kontrakty kanałów:
pnpm test:contracts:channels - Tylko kontrakty providerów:
pnpm test:contracts:plugins
Kontrakty kanałów
Znajdują się wsrc/channels/plugins/contracts/*.contract.test.ts:
- plugin - Podstawowy kształt pluginu (id, nazwa, capabilities)
- setup - Kontrakt kreatora konfiguracji
- session-binding - Zachowanie wiązania sesji
- outbound-payload - Struktura payloadu wiadomości
- inbound - Obsługa wiadomości przychodzących
- actions - Handlery akcji kanału
- threading - Obsługa ID wątku
- directory - API katalogu/roster
- group-policy - Egzekwowanie polityki grupy
Kontrakty statusu providera
Znajdują się wsrc/plugins/contracts/*.contract.test.ts.
- status - Sondy statusu kanału
- registry - Kształt rejestru pluginów
Kontrakty providerów
Znajdują się wsrc/plugins/contracts/*.contract.test.ts:
- auth - Kontrakt przepływu auth
- auth-choice - Wybór/selekcja auth
- catalog - API katalogu modeli
- discovery - Wykrywanie pluginów
- loader - Ładowanie pluginów
- runtime - Runtime providera
- shape - Kształt/interfejs pluginu
- wizard - Kreator konfiguracji
Kiedy uruchamiać
- Po zmianie eksportów plugin-sdk lub subpathów
- Po dodaniu lub modyfikacji kanału albo pluginu providera
- Po refaktoryzacji rejestracji lub wykrywania pluginów
Dodawanie regresji (wskazówki)
Gdy naprawiasz problem providera/modelu wykryty live:- Dodaj regresję bezpieczną dla CI, jeśli to możliwe (mock/stub providera albo uchwycenie dokładnej transformacji kształtu żądania)
- Jeśli jest to z natury tylko live (limity szybkości, polityki auth), utrzymaj test live wąski i opt-in przez zmienne env
- Preferuj celowanie w najmniejszą warstwę, która łapie błąd:
- błąd konwersji/odtworzenia żądania providera → bezpośredni test modeli
- błąd pipeline’u sesji/historii/narzędzi Gateway → smoke live Gateway lub bezpieczny dla CI mock test Gateway
- Bariera ochronna przechodzenia SecretRef:
src/secrets/exec-secret-ref-id-parity.test.tswyprowadza jeden próbkowany cel na klasę SecretRef z metadanych rejestru (listSecretTargetRegistryEntries()), a następnie asertuje, że identyfikatory exec z segmentami przechodzenia są odrzucane.- Jeśli dodasz nową rodzinę celów SecretRef
includeInPlanwsrc/secrets/target-registry-data.ts, zaktualizujclassifyTargetClassw tym teście. Test celowo kończy się niepowodzeniem dla niesklasyfikowanych identyfikatorów celów, aby nowe klasy nie mogły zostać pominięte po cichu.