diff --git a/docs/docker.md b/docs/docker.md index 4d553536e..c587233c6 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -59,6 +59,12 @@ docker compose exec clawdbot-gateway node dist/index.js health --token "$CLAWDBO scripts/e2e/onboard-docker.sh ``` +### QR import smoke test (Docker) + +```bash +pnpm test:docker:qr +``` + ### Notes - Gateway bind defaults to `lan` for container use. diff --git a/docs/test.md b/docs/test.md index cb0bcbe19..b31a57fbb 100644 --- a/docs/test.md +++ b/docs/test.md @@ -33,3 +33,11 @@ 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 `clawdbot health`. + +## QR import smoke (Docker) + +Ensures `qrcode-terminal` loads under Node 22+ in Docker: + +```bash +pnpm test:docker:qr +``` diff --git a/package.json b/package.json index 23e044de8..5ddc0c3a7 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "test:force": "tsx scripts/test-force.ts", "test:coverage": "vitest run --coverage", "test:e2e": "vitest run --config vitest.e2e.config.ts", + "test:docker:qr": "bash scripts/e2e/qr-import-docker.sh", "protocol:gen": "tsx scripts/protocol-gen.ts", "protocol:gen:swift": "tsx scripts/protocol-gen-swift.ts", "protocol:check": "pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/ClawdbotProtocol/GatewayModels.swift", @@ -148,7 +149,8 @@ "@sinclair/typebox": "0.34.46" }, "patchedDependencies": { - "@mariozechner/pi-ai": "patches/@mariozechner__pi-ai.patch" + "@mariozechner/pi-ai": "patches/@mariozechner__pi-ai.patch", + "qrcode-terminal": "patches/qrcode-terminal.patch" } }, "vitest": { diff --git a/patches/qrcode-terminal.patch b/patches/qrcode-terminal.patch new file mode 100644 index 000000000..96929c20b --- /dev/null +++ b/patches/qrcode-terminal.patch @@ -0,0 +1,12 @@ +diff --git a/lib/main.js b/lib/main.js +index 488cc1aea9802b3d6ae13aee27556403bec55d1c..3de1f934868d81e8204f00e6a4bf2696a05f7340 100644 +--- a/lib/main.js ++++ b/lib/main.js +@@ -1,5 +1,5 @@ +-var QRCode = require('./../vendor/QRCode'), +- QRErrorCorrectLevel = require('./../vendor/QRCode/QRErrorCorrectLevel'), ++var QRCode = require('./../vendor/QRCode/index.js'), ++ QRErrorCorrectLevel = require('./../vendor/QRCode/QRErrorCorrectLevel.js'), + black = "\033[40m \033[0m", + white = "\033[47m \033[0m", + toCell = function (isBlack) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11815c700..ce9e10913 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ patchedDependencies: '@mariozechner/pi-ai': hash: 628fb051b6f4886984a846a5ee7aa0a571c3360d35b8d114e4684e5edcd100c5 path: patches/@mariozechner__pi-ai.patch + qrcode-terminal: + hash: ed82029850dbdf551f5df1de320945af52b8ea8500cc7bd4f39258e7a3d92e12 + path: patches/qrcode-terminal.patch importers: @@ -102,7 +105,7 @@ importers: version: 1.57.0 qrcode-terminal: specifier: ^0.12.0 - version: 0.12.0 + version: 0.12.0(patch_hash=ed82029850dbdf551f5df1de320945af52b8ea8500cc7bd4f39258e7a3d92e12) sharp: specifier: ^0.34.5 version: 0.34.5 @@ -5460,7 +5463,7 @@ snapshots: '@thi.ng/bitstream': 2.4.37 optional: true - qrcode-terminal@0.12.0: {} + qrcode-terminal@0.12.0(patch_hash=ed82029850dbdf551f5df1de320945af52b8ea8500cc7bd4f39258e7a3d92e12): {} qs@6.14.1: dependencies: diff --git a/scripts/e2e/Dockerfile.qr-import b/scripts/e2e/Dockerfile.qr-import new file mode 100644 index 000000000..c2370044d --- /dev/null +++ b/scripts/e2e/Dockerfile.qr-import @@ -0,0 +1,9 @@ +FROM node:22-bookworm + +RUN corepack enable + +WORKDIR /app + +COPY . . + +RUN pnpm install --frozen-lockfile diff --git a/scripts/e2e/qr-import-docker.sh b/scripts/e2e/qr-import-docker.sh new file mode 100755 index 000000000..036a996a1 --- /dev/null +++ b/scripts/e2e/qr-import-docker.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +IMAGE_NAME="${CLAWDBOT_QR_SMOKE_IMAGE:-clawdbot-qr-smoke}" + +echo "Building Docker image..." +docker build -t "$IMAGE_NAME" -f "$ROOT_DIR/scripts/e2e/Dockerfile.qr-import" "$ROOT_DIR" + +echo "Running qrcode-terminal import smoke..." +docker run --rm -t "$IMAGE_NAME" node -e "import('qrcode-terminal').then((m)=>m.default.generate('qr-smoke',{small:true}))"