diff --git a/scripts/e2e/kitchen-sink-plugin-docker.sh b/scripts/e2e/kitchen-sink-plugin-docker.sh index 380d8116261..3d82908e893 100644 --- a/scripts/e2e/kitchen-sink-plugin-docker.sh +++ b/scripts/e2e/kitchen-sink-plugin-docker.sh @@ -36,18 +36,20 @@ DOCKER_ENV_ARGS=( -e "OPENCLAW_TEST_STATE_SCRIPT_B64=$OPENCLAW_TEST_STATE_SCRIPT_B64" -e "KITCHEN_SINK_SCENARIOS=$KITCHEN_SINK_SCENARIOS" ) -for env_name in \ - OPENCLAW_KITCHEN_SINK_LIVE_CLAWHUB \ - OPENCLAW_CLAWHUB_URL \ - CLAWHUB_URL \ - OPENCLAW_CLAWHUB_TOKEN \ - CLAWHUB_TOKEN \ - CLAWHUB_AUTH_TOKEN; do - env_value="${!env_name:-}" - if [[ -n "$env_value" && "$env_value" != "undefined" && "$env_value" != "null" ]]; then - DOCKER_ENV_ARGS+=(-e "$env_name") - fi -done +if [[ "${OPENCLAW_KITCHEN_SINK_LIVE_CLAWHUB:-0}" = "1" ]]; then + for env_name in \ + OPENCLAW_KITCHEN_SINK_LIVE_CLAWHUB \ + OPENCLAW_CLAWHUB_URL \ + CLAWHUB_URL \ + OPENCLAW_CLAWHUB_TOKEN \ + CLAWHUB_TOKEN \ + CLAWHUB_AUTH_TOKEN; do + env_value="${!env_name:-}" + if [[ -n "$env_value" && "$env_value" != "undefined" && "$env_value" != "null" ]]; then + DOCKER_ENV_ARGS+=(-e "$env_name") + fi + done +fi echo "Running kitchen-sink plugin Docker E2E..." docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true diff --git a/scripts/e2e/lib/kitchen-sink-plugin/sweep.sh b/scripts/e2e/lib/kitchen-sink-plugin/sweep.sh index 39cd3122430..6f45fa06173 100644 --- a/scripts/e2e/lib/kitchen-sink-plugin/sweep.sh +++ b/scripts/e2e/lib/kitchen-sink-plugin/sweep.sh @@ -112,11 +112,17 @@ run_failure_scenario() { assert_kitchen_sink_removed } -if [[ "$KITCHEN_SINK_SCENARIOS" == *"clawhub:"* ]] && - [[ "${OPENCLAW_KITCHEN_SINK_LIVE_CLAWHUB:-0}" != "1" ]] && - [[ -z "${OPENCLAW_CLAWHUB_URL:-}" && -z "${CLAWHUB_URL:-}" ]]; then - clawhub_fixture_dir="$(mktemp -d "/tmp/openclaw-kitchen-sink-clawhub.XXXXXX")" - start_kitchen_sink_clawhub_fixture_server "$clawhub_fixture_dir" +if [[ "$KITCHEN_SINK_SCENARIOS" == *"clawhub:"* ]]; then + if [[ "${OPENCLAW_KITCHEN_SINK_LIVE_CLAWHUB:-0}" = "1" ]]; then + export OPENCLAW_CLAWHUB_URL="${OPENCLAW_CLAWHUB_URL:-${CLAWHUB_URL:-https://clawhub.ai}}" + else + if [[ -n "${OPENCLAW_CLAWHUB_URL:-}" || -n "${CLAWHUB_URL:-}" ]]; then + echo "Ignoring ambient ClawHub URL for fixture-mode kitchen-sink E2E; set OPENCLAW_KITCHEN_SINK_LIVE_CLAWHUB=1 for live ClawHub." + fi + unset OPENCLAW_CLAWHUB_URL CLAWHUB_URL + clawhub_fixture_dir="$(mktemp -d "/tmp/openclaw-kitchen-sink-clawhub.XXXXXX")" + start_kitchen_sink_clawhub_fixture_server "$clawhub_fixture_dir" + fi fi scenario_count=0 diff --git a/scripts/e2e/lib/plugins/clawhub.sh b/scripts/e2e/lib/plugins/clawhub.sh index 48386643473..8b5b2d90d05 100644 --- a/scripts/e2e/lib/plugins/clawhub.sh +++ b/scripts/e2e/lib/plugins/clawhub.sh @@ -38,8 +38,12 @@ run_plugins_clawhub_scenario() { if [[ "${OPENCLAW_PLUGINS_E2E_LIVE_CLAWHUB:-0}" = "1" ]]; then export OPENCLAW_CLAWHUB_URL="${OPENCLAW_CLAWHUB_URL:-${CLAWHUB_URL:-https://clawhub.ai}}" export NPM_CONFIG_REGISTRY="${OPENCLAW_PLUGINS_E2E_LIVE_NPM_REGISTRY:-https://registry.npmjs.org/}" - elif [[ -z "${OPENCLAW_CLAWHUB_URL:-}" && -z "${CLAWHUB_URL:-}" ]]; then + else # Keep the release-path smoke hermetic; live ClawHub can rate-limit CI. + if [[ -n "${OPENCLAW_CLAWHUB_URL:-}" || -n "${CLAWHUB_URL:-}" ]]; then + echo "Ignoring ambient ClawHub URL for fixture-mode plugin E2E; set OPENCLAW_PLUGINS_E2E_LIVE_CLAWHUB=1 for live ClawHub." + fi + unset OPENCLAW_CLAWHUB_URL CLAWHUB_URL clawhub_fixture_dir="$(mktemp -d "/tmp/openclaw-clawhub-fixture.XXXXXX")" start_clawhub_fixture_server "$clawhub_fixture_dir" fi diff --git a/scripts/e2e/npm-onboard-channel-agent-docker.sh b/scripts/e2e/npm-onboard-channel-agent-docker.sh index 0ac9ffd2fd4..a0e1b3cce5e 100644 --- a/scripts/e2e/npm-onboard-channel-agent-docker.sh +++ b/scripts/e2e/npm-onboard-channel-agent-docker.sh @@ -105,7 +105,12 @@ openclaw_e2e_install_package /tmp/openclaw-install.log command -v openclaw >/dev/null package_root="$(openclaw_e2e_package_root)" -openclaw_e2e_assert_package_extensions "$package_root" telegram discord +if [ -d "$package_root/dist/extensions/$CHANNEL" ]; then + CHANNEL_PACKAGE_MODE="bundled" +else + CHANNEL_PACKAGE_MODE="external" + echo "$CHANNEL is not packaged with core OpenClaw; expecting channel selection to install it on demand." +fi mock_pid="$(openclaw_e2e_start_mock_openai "$MOCK_PORT" /tmp/openclaw-mock-openai.log)" openclaw_e2e_wait_mock_openai "$MOCK_PORT" @@ -134,7 +139,11 @@ node scripts/e2e/lib/npm-onboard-channel-agent/assertions.mjs assert-channel-con echo "Running doctor after channel activation..." openclaw doctor --repair --non-interactive >/tmp/openclaw-doctor.log 2>&1 -openclaw_e2e_assert_dep_absent "$DEP_SENTINEL" "$HOME/.openclaw" +if [ "$CHANNEL_PACKAGE_MODE" = "external" ]; then + openclaw_e2e_assert_dep_present "$DEP_SENTINEL" "$HOME/.openclaw" +else + openclaw_e2e_assert_dep_absent "$DEP_SENTINEL" "$HOME/.openclaw" +fi echo "Running local agent turn against mocked OpenAI..." openclaw agent --local \ diff --git a/scripts/e2e/plugins-docker.sh b/scripts/e2e/plugins-docker.sh index dc6f31f6a07..059e0c3ad55 100755 --- a/scripts/e2e/plugins-docker.sh +++ b/scripts/e2e/plugins-docker.sh @@ -16,17 +16,25 @@ for env_name in \ OPENCLAW_PLUGINS_E2E_CLAWHUB \ OPENCLAW_PLUGINS_E2E_LIVE_CLAWHUB \ OPENCLAW_PLUGINS_E2E_CLAWHUB_SPEC \ - OPENCLAW_PLUGINS_E2E_CLAWHUB_ID \ - OPENCLAW_CLAWHUB_URL \ - CLAWHUB_URL \ - OPENCLAW_CLAWHUB_TOKEN \ - CLAWHUB_TOKEN \ - CLAWHUB_AUTH_TOKEN; do + OPENCLAW_PLUGINS_E2E_CLAWHUB_ID; do env_value="${!env_name:-}" if [[ -n "$env_value" && "$env_value" != "undefined" && "$env_value" != "null" ]]; then DOCKER_ENV_ARGS+=(-e "$env_name") fi done +if [[ "${OPENCLAW_PLUGINS_E2E_LIVE_CLAWHUB:-0}" = "1" ]]; then + for env_name in \ + OPENCLAW_CLAWHUB_URL \ + CLAWHUB_URL \ + OPENCLAW_CLAWHUB_TOKEN \ + CLAWHUB_TOKEN \ + CLAWHUB_AUTH_TOKEN; do + env_value="${!env_name:-}" + if [[ -n "$env_value" && "$env_value" != "undefined" && "$env_value" != "null" ]]; then + DOCKER_ENV_ARGS+=(-e "$env_name") + fi + done +fi echo "Running plugins Docker E2E..." docker_e2e_run_logged_with_harness plugins-run "${DOCKER_ENV_ARGS[@]}" "$IMAGE_NAME" bash scripts/e2e/lib/plugins/sweep.sh diff --git a/scripts/lib/docker-e2e-scenarios.mjs b/scripts/lib/docker-e2e-scenarios.mjs index 7fbedbe121e..b95b0078bef 100644 --- a/scripts/lib/docker-e2e-scenarios.mjs +++ b/scripts/lib/docker-e2e-scenarios.mjs @@ -170,6 +170,11 @@ export const mainLanes = [ "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:npm-onboard-channel-agent", { resources: ["service"], stateScenario: "empty", weight: 3 }, ), + npmLane( + "npm-onboard-discord-channel-agent", + "OPENCLAW_NPM_ONBOARD_CHANNEL=discord OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:npm-onboard-channel-agent", + { resources: ["service"], stateScenario: "empty", weight: 3 }, + ), serviceLane("gateway-network", "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:gateway-network"), serviceLane( "agents-delete-shared-workspace", @@ -475,6 +480,11 @@ const releasePathPackageUpdateCoreLanes = [ "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:npm-onboard-channel-agent", { resources: ["service"], stateScenario: "empty", weight: 3 }, ), + npmLane( + "npm-onboard-discord-channel-agent", + "OPENCLAW_NPM_ONBOARD_CHANNEL=discord OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:npm-onboard-channel-agent", + { resources: ["service"], stateScenario: "empty", weight: 3 }, + ), npmLane("doctor-switch", "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:doctor-switch", { stateScenario: "empty", weight: 3, diff --git a/scripts/lib/plugin-prerelease-test-plan.mjs b/scripts/lib/plugin-prerelease-test-plan.mjs index cf0ece6365b..7ada7f13b18 100644 --- a/scripts/lib/plugin-prerelease-test-plan.mjs +++ b/scripts/lib/plugin-prerelease-test-plan.mjs @@ -23,6 +23,16 @@ const pluginPrereleaseDockerLanes = Object.freeze([ lane: "npm-onboard-channel-agent", surfaces: ["package-artifact", "gateway-bootstrap", "status-diagnostics"], }, + { + lane: "npm-onboard-discord-channel-agent", + surfaces: [ + "package-artifact", + "external-plugins", + "installed-plugin-deps", + "gateway-bootstrap", + "status-diagnostics", + ], + }, { lane: "doctor-switch", surfaces: ["package-artifact", "doctor-fix"],