refactor: rename to openclaw
This commit is contained in:
@@ -3,18 +3,18 @@
|
||||
# Run via cron or systemd timer to get proactive notifications
|
||||
# before Claude Code auth expires.
|
||||
#
|
||||
# Suggested cron: */30 * * * * /home/admin/moltbot/scripts/auth-monitor.sh
|
||||
# Suggested cron: */30 * * * * /home/admin/openclaw/scripts/auth-monitor.sh
|
||||
#
|
||||
# Environment variables:
|
||||
# NOTIFY_PHONE - Phone number to send Moltbot notification (e.g., +1234567890)
|
||||
# NOTIFY_NTFY - ntfy.sh topic for push notifications (e.g., moltbot-alerts)
|
||||
# NOTIFY_PHONE - Phone number to send OpenClaw notification (e.g., +1234567890)
|
||||
# NOTIFY_NTFY - ntfy.sh topic for push notifications (e.g., openclaw-alerts)
|
||||
# WARN_HOURS - Hours before expiry to warn (default: 2)
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
CLAUDE_CREDS="$HOME/.claude/.credentials.json"
|
||||
STATE_FILE="$HOME/.clawdbot/auth-monitor-state"
|
||||
STATE_FILE="$HOME/.openclaw/auth-monitor-state"
|
||||
|
||||
# Configuration
|
||||
WARN_HOURS="${WARN_HOURS:-2}"
|
||||
@@ -41,12 +41,12 @@ send_notification() {
|
||||
return
|
||||
fi
|
||||
|
||||
# Send via Moltbot if phone configured and auth still valid
|
||||
# Send via OpenClaw if phone configured and auth still valid
|
||||
if [ -n "$NOTIFY_PHONE" ]; then
|
||||
# Check if we can still use moltbot
|
||||
# Check if we can still use openclaw
|
||||
if "$SCRIPT_DIR/claude-auth-status.sh" simple 2>/dev/null | grep -q "OK\|EXPIRING"; then
|
||||
echo "Sending via Moltbot to $NOTIFY_PHONE..."
|
||||
moltbot send --to "$NOTIFY_PHONE" --message "$message" 2>/dev/null || true
|
||||
echo "Sending via OpenClaw to $NOTIFY_PHONE..."
|
||||
openclaw send --to "$NOTIFY_PHONE" --message "$message" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -54,7 +54,7 @@ send_notification() {
|
||||
if [ -n "$NOTIFY_NTFY" ]; then
|
||||
echo "Sending via ntfy.sh to $NOTIFY_NTFY..."
|
||||
curl -s -o /dev/null \
|
||||
-H "Title: Moltbot Auth Alert" \
|
||||
-H "Title: OpenClaw Auth Alert" \
|
||||
-H "Priority: $priority" \
|
||||
-H "Tags: warning,key" \
|
||||
-d "$message" \
|
||||
@@ -78,7 +78,7 @@ HOURS_LEFT=$((DIFF_MS / 3600000))
|
||||
MINS_LEFT=$(((DIFF_MS % 3600000) / 60000))
|
||||
|
||||
if [ "$DIFF_MS" -lt 0 ]; then
|
||||
send_notification "Claude Code auth EXPIRED! Moltbot is down. Run: ssh l36 '~/moltbot/scripts/mobile-reauth.sh'" "urgent"
|
||||
send_notification "Claude Code auth EXPIRED! OpenClaw is down. Run: ssh l36 '~/openclaw/scripts/mobile-reauth.sh'" "urgent"
|
||||
exit 1
|
||||
elif [ "$HOURS_LEFT" -lt "$WARN_HOURS" ]; then
|
||||
send_notification "Claude Code auth expires in ${HOURS_LEFT}h ${MINS_LEFT}m. Consider re-auth soon." "high"
|
||||
|
||||
@@ -3,7 +3,7 @@ set -euo pipefail
|
||||
cd "$(dirname "$0")/../apps/macos"
|
||||
|
||||
BUILD_PATH=".build-local"
|
||||
PRODUCT="Moltbot"
|
||||
PRODUCT="OpenClaw"
|
||||
BIN="$BUILD_PATH/debug/$PRODUCT"
|
||||
|
||||
printf "\n▶️ Building $PRODUCT (debug, build path: $BUILD_PATH)\n"
|
||||
@@ -13,6 +13,6 @@ printf "\n⏹ Stopping existing $PRODUCT...\n"
|
||||
killall -q "$PRODUCT" 2>/dev/null || true
|
||||
|
||||
printf "\n🚀 Launching $BIN ...\n"
|
||||
nohup "$BIN" >/tmp/moltbot.log 2>&1 &
|
||||
nohup "$BIN" >/tmp/openclaw.log 2>&1 &
|
||||
PID=$!
|
||||
printf "Started $PRODUCT (PID $PID). Logs: /tmp/moltbot.log\n"
|
||||
printf "Started $PRODUCT (PID $PID). Logs: /tmp/openclaw.log\n"
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
set -euo pipefail
|
||||
|
||||
# Render the macOS .icon bundle to a padded .icns like Trimmy's pipeline.
|
||||
# Defaults target the Moltbot assets so you can just run the script from repo root.
|
||||
# Defaults target the OpenClaw assets so you can just run the script from repo root.
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
|
||||
ICON_FILE=${1:-"$ROOT_DIR/apps/macos/Icon.icon"}
|
||||
BASENAME=${2:-Moltbot}
|
||||
BASENAME=${2:-OpenClaw}
|
||||
OUT_ROOT=${3:-"$ROOT_DIR/apps/macos/build/icon"}
|
||||
XCODE_APP=${XCODE_APP:-/Applications/Xcode.app}
|
||||
# Where the final .icns should live; override DEST_ICNS to change.
|
||||
DEST_ICNS=${DEST_ICNS:-"$ROOT_DIR/apps/macos/Sources/Moltbot/Resources/Moltbot.icns"}
|
||||
DEST_ICNS=${DEST_ICNS:-"$ROOT_DIR/apps/macos/Sources/OpenClaw/Resources/OpenClaw.icns"}
|
||||
|
||||
ICTOOL="$XCODE_APP/Contents/Applications/Icon Composer.app/Contents/Executables/ictool"
|
||||
if [[ ! -x "$ICTOOL" ]]; then
|
||||
|
||||
@@ -11,7 +11,7 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
HASH_FILE="$ROOT_DIR/src/canvas-host/a2ui/.bundle.hash"
|
||||
OUTPUT_FILE="$ROOT_DIR/src/canvas-host/a2ui/a2ui.bundle.js"
|
||||
A2UI_RENDERER_DIR="$ROOT_DIR/vendor/a2ui/renderers/lit"
|
||||
A2UI_APP_DIR="$ROOT_DIR/apps/shared/MoltbotKit/Tools/CanvasA2UI"
|
||||
A2UI_APP_DIR="$ROOT_DIR/apps/shared/OpenClawKit/Tools/CanvasA2UI"
|
||||
|
||||
# Docker builds exclude vendor/apps via .dockerignore.
|
||||
# In that environment we must keep the prebuilt bundle.
|
||||
|
||||
@@ -6,9 +6,9 @@ const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."
|
||||
|
||||
export function getA2uiPaths(env = process.env) {
|
||||
const srcDir =
|
||||
env.CLAWDBOT_A2UI_SRC_DIR ?? path.join(repoRoot, "src", "canvas-host", "a2ui");
|
||||
env.OPENCLAW_A2UI_SRC_DIR ?? path.join(repoRoot, "src", "canvas-host", "a2ui");
|
||||
const outDir =
|
||||
env.CLAWDBOT_A2UI_OUT_DIR ?? path.join(repoRoot, "dist", "canvas-host", "a2ui");
|
||||
env.OPENCLAW_A2UI_OUT_DIR ?? path.join(repoRoot, "dist", "canvas-host", "a2ui");
|
||||
return { srcDir, outDir };
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ export async function copyA2uiAssets({
|
||||
srcDir: string;
|
||||
outDir: string;
|
||||
}) {
|
||||
const skipMissing = process.env.CLAWDBOT_A2UI_SKIP_MISSING === "1";
|
||||
const skipMissing = process.env.OPENCLAW_A2UI_SKIP_MISSING === "1";
|
||||
try {
|
||||
await fs.stat(path.join(srcDir, "index.html"));
|
||||
await fs.stat(path.join(srcDir, "a2ui.bundle.js"));
|
||||
@@ -27,7 +27,7 @@ export async function copyA2uiAssets({
|
||||
const message =
|
||||
'Missing A2UI bundle assets. Run "pnpm canvas:a2ui:bundle" and retry.';
|
||||
if (skipMissing) {
|
||||
console.warn(`${message} Skipping copy (CLAWDBOT_A2UI_SKIP_MISSING=1).`);
|
||||
console.warn(`${message} Skipping copy (OPENCLAW_A2UI_SKIP_MISSING=1).`);
|
||||
return;
|
||||
}
|
||||
throw new Error(message, { cause: err });
|
||||
|
||||
@@ -57,13 +57,13 @@ markdown_to_html() {
|
||||
|
||||
version_content=$(extract_version_section "$VERSION" "$CHANGELOG_FILE")
|
||||
if [[ -z "$version_content" ]]; then
|
||||
echo "<h2>Moltbot $VERSION</h2>"
|
||||
echo "<p>Latest Moltbot update.</p>"
|
||||
echo "<p><a href=\"https://github.com/moltbot/moltbot/blob/main/CHANGELOG.md\">View full changelog</a></p>"
|
||||
echo "<h2>OpenClaw $VERSION</h2>"
|
||||
echo "<p>Latest OpenClaw update.</p>"
|
||||
echo "<p><a href=\"https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md\">View full changelog</a></p>"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "<h2>Moltbot $VERSION</h2>"
|
||||
echo "<h2>OpenClaw $VERSION</h2>"
|
||||
|
||||
in_list=false
|
||||
while IFS= read -r line; do
|
||||
@@ -88,4 +88,4 @@ if [[ "$in_list" == true ]]; then
|
||||
echo "</ul>"
|
||||
fi
|
||||
|
||||
echo "<p><a href=\"https://github.com/moltbot/moltbot/blob/main/CHANGELOG.md\">View full changelog</a></p>"
|
||||
echo "<p><a href=\"https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md\">View full changelog</a></p>"
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#!/bin/bash
|
||||
# Claude Code Authentication Status Checker
|
||||
# Checks both Claude Code and Moltbot auth status
|
||||
# Checks both Claude Code and OpenClaw auth status
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
CLAUDE_CREDS="$HOME/.claude/.credentials.json"
|
||||
CLAWDBOT_AUTH="$HOME/.clawdbot/agents/main/agent/auth-profiles.json"
|
||||
OPENCLAW_AUTH="$HOME/.openclaw/agents/main/agent/auth-profiles.json"
|
||||
|
||||
# Colors for terminal output
|
||||
RED='\033[0;31m'
|
||||
@@ -17,7 +17,7 @@ NC='\033[0m' # No Color
|
||||
OUTPUT_MODE="${1:-full}"
|
||||
|
||||
fetch_models_status_json() {
|
||||
moltbot models status --json 2>/dev/null || true
|
||||
openclaw models status --json 2>/dev/null || true
|
||||
}
|
||||
|
||||
STATUS_JSON="$(fetch_models_status_json)"
|
||||
@@ -103,7 +103,7 @@ check_claude_code_auth() {
|
||||
calc_status_from_expires "$expires_at"
|
||||
}
|
||||
|
||||
check_moltbot_auth() {
|
||||
check_openclaw_auth() {
|
||||
if [ "$USE_JSON" -eq 1 ]; then
|
||||
local api_keys
|
||||
api_keys=$(json_anthropic_api_key_count)
|
||||
@@ -122,7 +122,7 @@ check_moltbot_auth() {
|
||||
return $?
|
||||
fi
|
||||
|
||||
if [ ! -f "$CLAWDBOT_AUTH" ]; then
|
||||
if [ ! -f "$OPENCLAW_AUTH" ]; then
|
||||
echo "MISSING"
|
||||
return 1
|
||||
fi
|
||||
@@ -131,7 +131,7 @@ check_moltbot_auth() {
|
||||
expires=$(jq -r '
|
||||
[.profiles | to_entries[] | select(.value.provider == "anthropic") | .value.expires]
|
||||
| max // 0
|
||||
' "$CLAWDBOT_AUTH" 2>/dev/null || echo "0")
|
||||
' "$OPENCLAW_AUTH" 2>/dev/null || echo "0")
|
||||
|
||||
calc_status_from_expires "$expires"
|
||||
}
|
||||
@@ -139,26 +139,26 @@ check_moltbot_auth() {
|
||||
# JSON output mode
|
||||
if [ "$OUTPUT_MODE" = "json" ]; then
|
||||
claude_status=$(check_claude_code_auth 2>/dev/null || true)
|
||||
moltbot_status=$(check_moltbot_auth 2>/dev/null || true)
|
||||
openclaw_status=$(check_openclaw_auth 2>/dev/null || true)
|
||||
|
||||
claude_expires=0
|
||||
moltbot_expires=0
|
||||
openclaw_expires=0
|
||||
if [ "$USE_JSON" -eq 1 ]; then
|
||||
claude_expires=$(json_expires_for_claude_cli)
|
||||
moltbot_expires=$(json_expires_for_anthropic_any)
|
||||
openclaw_expires=$(json_expires_for_anthropic_any)
|
||||
else
|
||||
claude_expires=$(jq -r '.claudeAiOauth.expiresAt // 0' "$CLAUDE_CREDS" 2>/dev/null || echo "0")
|
||||
moltbot_expires=$(jq -r '.profiles["anthropic:default"].expires // 0' "$CLAWDBOT_AUTH" 2>/dev/null || echo "0")
|
||||
openclaw_expires=$(jq -r '.profiles["anthropic:default"].expires // 0' "$OPENCLAW_AUTH" 2>/dev/null || echo "0")
|
||||
fi
|
||||
|
||||
jq -n \
|
||||
--arg cs "$claude_status" \
|
||||
--arg ce "$claude_expires" \
|
||||
--arg bs "$moltbot_status" \
|
||||
--arg be "$moltbot_expires" \
|
||||
--arg bs "$openclaw_status" \
|
||||
--arg be "$openclaw_expires" \
|
||||
'{
|
||||
claude_code: {status: $cs, expires_at_ms: ($ce | tonumber)},
|
||||
moltbot: {status: $bs, expires_at_ms: ($be | tonumber)},
|
||||
openclaw: {status: $bs, expires_at_ms: ($be | tonumber)},
|
||||
needs_reauth: (($cs | startswith("EXPIRED") or startswith("EXPIRING") or startswith("MISSING")) or ($bs | startswith("EXPIRED") or startswith("EXPIRING") or startswith("MISSING")))
|
||||
}'
|
||||
exit 0
|
||||
@@ -167,19 +167,19 @@ fi
|
||||
# Simple output mode (for scripts/widgets)
|
||||
if [ "$OUTPUT_MODE" = "simple" ]; then
|
||||
claude_status=$(check_claude_code_auth 2>/dev/null || true)
|
||||
moltbot_status=$(check_moltbot_auth 2>/dev/null || true)
|
||||
openclaw_status=$(check_openclaw_auth 2>/dev/null || true)
|
||||
|
||||
if [[ "$claude_status" == EXPIRED* ]] || [[ "$claude_status" == MISSING* ]]; then
|
||||
echo "CLAUDE_EXPIRED"
|
||||
exit 1
|
||||
elif [[ "$moltbot_status" == EXPIRED* ]] || [[ "$moltbot_status" == MISSING* ]]; then
|
||||
echo "CLAWDBOT_EXPIRED"
|
||||
elif [[ "$openclaw_status" == EXPIRED* ]] || [[ "$openclaw_status" == MISSING* ]]; then
|
||||
echo "OPENCLAW_EXPIRED"
|
||||
exit 1
|
||||
elif [[ "$claude_status" == EXPIRING* ]]; then
|
||||
echo "CLAUDE_EXPIRING"
|
||||
exit 2
|
||||
elif [[ "$moltbot_status" == EXPIRING* ]]; then
|
||||
echo "CLAWDBOT_EXPIRING"
|
||||
elif [[ "$openclaw_status" == EXPIRING* ]]; then
|
||||
echo "OPENCLAW_EXPIRING"
|
||||
exit 2
|
||||
else
|
||||
echo "OK"
|
||||
@@ -228,7 +228,7 @@ else
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Moltbot Auth (~/.clawdbot/agents/main/agent/auth-profiles.json):"
|
||||
echo "OpenClaw Auth (~/.openclaw/agents/main/agent/auth-profiles.json):"
|
||||
if [ "$USE_JSON" -eq 1 ]; then
|
||||
best_profile=$(json_best_anthropic_profile)
|
||||
expires=$(json_expires_for_anthropic_any)
|
||||
@@ -239,11 +239,11 @@ else
|
||||
| map(select(.value.provider == "anthropic"))
|
||||
| sort_by(.value.expires) | reverse
|
||||
| .[0].key // "none"
|
||||
' "$CLAWDBOT_AUTH" 2>/dev/null || echo "none")
|
||||
' "$OPENCLAW_AUTH" 2>/dev/null || echo "none")
|
||||
expires=$(jq -r '
|
||||
[.profiles | to_entries[] | select(.value.provider == "anthropic") | .value.expires]
|
||||
| max // 0
|
||||
' "$CLAWDBOT_AUTH" 2>/dev/null || echo "0")
|
||||
' "$OPENCLAW_AUTH" 2>/dev/null || echo "0")
|
||||
api_keys=0
|
||||
fi
|
||||
|
||||
@@ -253,7 +253,7 @@ if [ "$expires" -le 0 ] && [ "$api_keys" -gt 0 ]; then
|
||||
echo -e " Status: ${GREEN}OK${NC} (API key)"
|
||||
elif [ "$expires" -le 0 ]; then
|
||||
echo -e " Status: ${RED}NOT FOUND${NC}"
|
||||
echo " Note: Run 'moltbot doctor --yes' to sync from Claude Code"
|
||||
echo " Note: Run 'openclaw doctor --yes' to sync from Claude Code"
|
||||
else
|
||||
now_ms=$(( $(date +%s) * 1000 ))
|
||||
diff_ms=$((expires - now_ms))
|
||||
@@ -262,7 +262,7 @@ else
|
||||
|
||||
if [ "$diff_ms" -lt 0 ]; then
|
||||
echo -e " Status: ${RED}EXPIRED${NC}"
|
||||
echo " Note: Run 'moltbot doctor --yes' to sync from Claude Code"
|
||||
echo " Note: Run 'openclaw doctor --yes' to sync from Claude Code"
|
||||
elif [ "$diff_ms" -lt 3600000 ]; then
|
||||
echo -e " Status: ${YELLOW}EXPIRING SOON (${mins}m remaining)${NC}"
|
||||
else
|
||||
@@ -273,8 +273,8 @@ fi
|
||||
|
||||
echo ""
|
||||
echo "=== Service Status ==="
|
||||
if systemctl --user is-active moltbot >/dev/null 2>&1; then
|
||||
echo -e "Moltbot service: ${GREEN}running${NC}"
|
||||
if systemctl --user is-active openclaw >/dev/null 2>&1; then
|
||||
echo -e "OpenClaw service: ${GREEN}running${NC}"
|
||||
else
|
||||
echo -e "Moltbot service: ${RED}NOT running${NC}"
|
||||
echo -e "OpenClaw service: ${RED}NOT running${NC}"
|
||||
fi
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
# Configuration
|
||||
SUBSYSTEM="bot.molt"
|
||||
SUBSYSTEM="ai.openclaw"
|
||||
DEFAULT_LEVEL="info"
|
||||
|
||||
# Colors for output
|
||||
@@ -48,17 +48,17 @@ SHOW_HELP=false
|
||||
# Function to show usage
|
||||
show_usage() {
|
||||
cat << EOF
|
||||
clawlog - Moltbot Logging Utility
|
||||
clawlog - OpenClaw Logging Utility
|
||||
|
||||
USAGE:
|
||||
clawlog [OPTIONS]
|
||||
|
||||
DESCRIPTION:
|
||||
View Moltbot logs with full details (bypasses Apple's privacy redaction).
|
||||
View OpenClaw logs with full details (bypasses Apple's privacy redaction).
|
||||
Requires sudo access configured for /usr/bin/log command.
|
||||
|
||||
LOG FLOW ARCHITECTURE:
|
||||
Moltbot logs flow through the macOS unified log (subsystem: bot.molt).
|
||||
OpenClaw logs flow through the macOS unified log (subsystem: ai.openclaw).
|
||||
|
||||
LOG CATEGORIES (examples):
|
||||
• voicewake - Voice wake detection/test harness
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
APP_BUNDLE="${1:-dist/Moltbot.app}"
|
||||
APP_BUNDLE="${1:-dist/OpenClaw.app}"
|
||||
IDENTITY="${SIGN_IDENTITY:-}"
|
||||
TIMESTAMP_MODE="${CODESIGN_TIMESTAMP:-auto}"
|
||||
DISABLE_LIBRARY_VALIDATION="${DISABLE_LIBRARY_VALIDATION:-0}"
|
||||
SKIP_TEAM_ID_CHECK="${SKIP_TEAM_ID_CHECK:-0}"
|
||||
ENT_TMP_BASE=$(mktemp -t moltbot-entitlements-base.XXXXXX)
|
||||
ENT_TMP_APP_BASE=$(mktemp -t moltbot-entitlements-app-base.XXXXXX)
|
||||
ENT_TMP_RUNTIME=$(mktemp -t moltbot-entitlements-runtime.XXXXXX)
|
||||
ENT_TMP_BASE=$(mktemp -t openclaw-entitlements-base.XXXXXX)
|
||||
ENT_TMP_APP_BASE=$(mktemp -t openclaw-entitlements-app-base.XXXXXX)
|
||||
ENT_TMP_RUNTIME=$(mktemp -t openclaw-entitlements-runtime.XXXXXX)
|
||||
|
||||
if [[ "${APP_BUNDLE}" == "--help" || "${APP_BUNDLE}" == "-h" ]]; then
|
||||
cat <<'HELP'
|
||||
@@ -248,8 +248,8 @@ verify_team_ids() {
|
||||
}
|
||||
|
||||
# Sign main binary
|
||||
if [ -f "$APP_BUNDLE/Contents/MacOS/Moltbot" ]; then
|
||||
echo "Signing main binary"; sign_item "$APP_BUNDLE/Contents/MacOS/Moltbot" "$APP_ENTITLEMENTS"
|
||||
if [ -f "$APP_BUNDLE/Contents/MacOS/OpenClaw" ]; then
|
||||
echo "Signing main binary"; sign_item "$APP_BUNDLE/Contents/MacOS/OpenClaw" "$APP_ENTITLEMENTS"
|
||||
fi
|
||||
|
||||
# Sign Sparkle deeply if present
|
||||
|
||||
@@ -7,7 +7,7 @@ set -euo pipefail
|
||||
# scripts/create-dmg.sh <app_path> [output_dmg]
|
||||
#
|
||||
# Env:
|
||||
# DMG_VOLUME_NAME default: CFBundleName (or "Moltbot")
|
||||
# DMG_VOLUME_NAME default: CFBundleName (or "OpenClaw")
|
||||
# DMG_BACKGROUND_PATH default: assets/dmg-background.png
|
||||
# DMG_BACKGROUND_SMALL default: assets/dmg-background-small.png (recommended)
|
||||
# DMG_WINDOW_BOUNDS default: "400 100 900 420" (500x320)
|
||||
@@ -33,7 +33,7 @@ ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
BUILD_DIR="$ROOT_DIR/dist"
|
||||
mkdir -p "$BUILD_DIR"
|
||||
|
||||
APP_NAME=$(/usr/libexec/PlistBuddy -c "Print CFBundleName" "$APP_PATH/Contents/Info.plist" 2>/dev/null || echo "Moltbot")
|
||||
APP_NAME=$(/usr/libexec/PlistBuddy -c "Print CFBundleName" "$APP_PATH/Contents/Info.plist" 2>/dev/null || echo "OpenClaw")
|
||||
VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$APP_PATH/Contents/Info.plist" 2>/dev/null || echo "0.0.0")
|
||||
|
||||
DMG_NAME="${APP_NAME}-${VERSION}.dmg"
|
||||
@@ -71,7 +71,7 @@ for vol in "/Volumes/$DMG_VOLUME_NAME"* "/Volumes/$APP_NAME"*; do
|
||||
fi
|
||||
done
|
||||
|
||||
DMG_TEMP="$(mktemp -d /tmp/moltbot-dmg.XXXXXX)"
|
||||
DMG_TEMP="$(mktemp -d /tmp/openclaw-dmg.XXXXXX)"
|
||||
trap 'hdiutil detach "/Volumes/'"$DMG_VOLUME_NAME"'" -force 2>/dev/null || true; rm -rf "$DMG_TEMP" 2>/dev/null || true' EXIT
|
||||
|
||||
cp -R "$APP_PATH" "$DMG_TEMP/"
|
||||
@@ -109,7 +109,7 @@ if [[ "${SKIP_DMG_STYLE:-0}" != "1" ]]; then
|
||||
fi
|
||||
|
||||
# Volume icon: reuse the app icon if available.
|
||||
ICON_SRC="$ROOT_DIR/apps/macos/Sources/Moltbot/Resources/Moltbot.icns"
|
||||
ICON_SRC="$ROOT_DIR/apps/macos/Sources/OpenClaw/Resources/OpenClaw.icns"
|
||||
if [[ -f "$ICON_SRC" ]]; then
|
||||
cp "$ICON_SRC" "$MOUNT_POINT/.VolumeIcon.icns"
|
||||
if command -v SetFile >/dev/null 2>&1; then
|
||||
@@ -160,9 +160,9 @@ for i in {1..5}; do
|
||||
sleep 2
|
||||
done
|
||||
|
||||
hdiutil resize -limits "$DMG_RW_PATH" >/tmp/moltbot-dmg-limits.txt 2>/dev/null || true
|
||||
MIN_SECTORS="$(tail -n 1 /tmp/moltbot-dmg-limits.txt 2>/dev/null | awk '{print $1}')"
|
||||
rm -f /tmp/moltbot-dmg-limits.txt
|
||||
hdiutil resize -limits "$DMG_RW_PATH" >/tmp/openclaw-dmg-limits.txt 2>/dev/null || true
|
||||
MIN_SECTORS="$(tail -n 1 /tmp/openclaw-dmg-limits.txt 2>/dev/null | awk '{print $1}')"
|
||||
rm -f /tmp/openclaw-dmg-limits.txt
|
||||
if [[ "$MIN_SECTORS" =~ ^[0-9]+$ ]] && [[ "$DMG_EXTRA_SECTORS" =~ ^[0-9]+$ ]]; then
|
||||
TARGET_SECTORS=$((MIN_SECTORS + DMG_EXTRA_SECTORS))
|
||||
echo "Shrinking RW image: min sectors=$MIN_SECTORS (+$DMG_EXTRA_SECTORS) -> $TARGET_SECTORS"
|
||||
|
||||
@@ -44,7 +44,9 @@ const parseArgs = (): Args => {
|
||||
|
||||
const loadAuthProfiles = (agentId: string) => {
|
||||
const stateRoot =
|
||||
process.env.CLAWDBOT_STATE_DIR?.trim() || path.join(os.homedir(), ".clawdbot");
|
||||
process.env.OPENCLAW_STATE_DIR?.trim() ||
|
||||
process.env.CLAWDBOT_STATE_DIR?.trim() ||
|
||||
path.join(os.homedir(), ".openclaw");
|
||||
const authPath = path.join(stateRoot, "agents", agentId, "agent", "auth-profiles.json");
|
||||
if (!fs.existsSync(authPath)) throw new Error(`Missing: ${authPath}`);
|
||||
const store = JSON.parse(fs.readFileSync(authPath, "utf8")) as {
|
||||
@@ -73,7 +75,7 @@ const fetchAnthropicOAuthUsage = async (token: string) => {
|
||||
Accept: "application/json",
|
||||
"anthropic-version": "2023-06-01",
|
||||
"anthropic-beta": "oauth-2025-04-20",
|
||||
"User-Agent": "moltbot-debug",
|
||||
"User-Agent": "openclaw-debug",
|
||||
},
|
||||
});
|
||||
const text = await res.text();
|
||||
|
||||
@@ -14,7 +14,7 @@ RUN corepack enable \
|
||||
&& pnpm install --frozen-lockfile
|
||||
|
||||
COPY . .
|
||||
COPY scripts/docker/cleanup-smoke/run.sh /usr/local/bin/moltbot-cleanup-smoke
|
||||
RUN chmod +x /usr/local/bin/moltbot-cleanup-smoke
|
||||
COPY scripts/docker/cleanup-smoke/run.sh /usr/local/bin/openclaw-cleanup-smoke
|
||||
RUN chmod +x /usr/local/bin/openclaw-cleanup-smoke
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/moltbot-cleanup-smoke"]
|
||||
ENTRYPOINT ["/usr/local/bin/openclaw-cleanup-smoke"]
|
||||
|
||||
@@ -3,30 +3,30 @@ set -euo pipefail
|
||||
|
||||
cd /repo
|
||||
|
||||
export CLAWDBOT_STATE_DIR="/tmp/moltbot-test"
|
||||
export CLAWDBOT_CONFIG_PATH="${CLAWDBOT_STATE_DIR}/moltbot.json"
|
||||
export OPENCLAW_STATE_DIR="/tmp/openclaw-test"
|
||||
export OPENCLAW_CONFIG_PATH="${OPENCLAW_STATE_DIR}/openclaw.json"
|
||||
|
||||
echo "==> Seed state"
|
||||
mkdir -p "${CLAWDBOT_STATE_DIR}/credentials"
|
||||
mkdir -p "${CLAWDBOT_STATE_DIR}/agents/main/sessions"
|
||||
echo '{}' >"${CLAWDBOT_CONFIG_PATH}"
|
||||
echo 'creds' >"${CLAWDBOT_STATE_DIR}/credentials/marker.txt"
|
||||
echo 'session' >"${CLAWDBOT_STATE_DIR}/agents/main/sessions/sessions.json"
|
||||
mkdir -p "${OPENCLAW_STATE_DIR}/credentials"
|
||||
mkdir -p "${OPENCLAW_STATE_DIR}/agents/main/sessions"
|
||||
echo '{}' >"${OPENCLAW_CONFIG_PATH}"
|
||||
echo 'creds' >"${OPENCLAW_STATE_DIR}/credentials/marker.txt"
|
||||
echo 'session' >"${OPENCLAW_STATE_DIR}/agents/main/sessions/sessions.json"
|
||||
|
||||
echo "==> Reset (config+creds+sessions)"
|
||||
pnpm moltbot reset --scope config+creds+sessions --yes --non-interactive
|
||||
pnpm openclaw reset --scope config+creds+sessions --yes --non-interactive
|
||||
|
||||
test ! -f "${CLAWDBOT_CONFIG_PATH}"
|
||||
test ! -d "${CLAWDBOT_STATE_DIR}/credentials"
|
||||
test ! -d "${CLAWDBOT_STATE_DIR}/agents/main/sessions"
|
||||
test ! -f "${OPENCLAW_CONFIG_PATH}"
|
||||
test ! -d "${OPENCLAW_STATE_DIR}/credentials"
|
||||
test ! -d "${OPENCLAW_STATE_DIR}/agents/main/sessions"
|
||||
|
||||
echo "==> Recreate minimal config"
|
||||
mkdir -p "${CLAWDBOT_STATE_DIR}/credentials"
|
||||
echo '{}' >"${CLAWDBOT_CONFIG_PATH}"
|
||||
mkdir -p "${OPENCLAW_STATE_DIR}/credentials"
|
||||
echo '{}' >"${OPENCLAW_CONFIG_PATH}"
|
||||
|
||||
echo "==> Uninstall (state only)"
|
||||
pnpm moltbot uninstall --state --yes --non-interactive
|
||||
pnpm openclaw uninstall --state --yes --non-interactive
|
||||
|
||||
test ! -d "${CLAWDBOT_STATE_DIR}"
|
||||
test ! -d "${OPENCLAW_STATE_DIR}"
|
||||
|
||||
echo "OK"
|
||||
|
||||
@@ -8,7 +8,7 @@ RUN apt-get update \
|
||||
git \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY run.sh /usr/local/bin/moltbot-install-e2e
|
||||
RUN chmod +x /usr/local/bin/moltbot-install-e2e
|
||||
COPY run.sh /usr/local/bin/openclaw-install-e2e
|
||||
RUN chmod +x /usr/local/bin/openclaw-install-e2e
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/moltbot-install-e2e"]
|
||||
ENTRYPOINT ["/usr/local/bin/openclaw-install-e2e"]
|
||||
|
||||
@@ -1,41 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://molt.bot/install.sh}"
|
||||
MODELS_MODE="${CLAWDBOT_E2E_MODELS:-both}" # both|openai|anthropic
|
||||
INSTALL_TAG="${CLAWDBOT_INSTALL_TAG:-latest}"
|
||||
E2E_PREVIOUS_VERSION="${CLAWDBOT_INSTALL_E2E_PREVIOUS:-}"
|
||||
SKIP_PREVIOUS="${CLAWDBOT_INSTALL_E2E_SKIP_PREVIOUS:-0}"
|
||||
INSTALL_URL="${OPENCLAW_INSTALL_URL:-${CLAWDBOT_INSTALL_URL:-https://openclaw.bot/install.sh}}"
|
||||
MODELS_MODE="${OPENCLAW_E2E_MODELS:-${CLAWDBOT_E2E_MODELS:-both}}" # both|openai|anthropic
|
||||
INSTALL_TAG="${OPENCLAW_INSTALL_TAG:-${CLAWDBOT_INSTALL_TAG:-latest}}"
|
||||
E2E_PREVIOUS_VERSION="${OPENCLAW_INSTALL_E2E_PREVIOUS:-${CLAWDBOT_INSTALL_E2E_PREVIOUS:-}}"
|
||||
SKIP_PREVIOUS="${OPENCLAW_INSTALL_E2E_SKIP_PREVIOUS:-${CLAWDBOT_INSTALL_E2E_SKIP_PREVIOUS:-0}}"
|
||||
OPENAI_API_KEY="${OPENAI_API_KEY:-}"
|
||||
ANTHROPIC_API_KEY="${ANTHROPIC_API_KEY:-}"
|
||||
ANTHROPIC_API_TOKEN="${ANTHROPIC_API_TOKEN:-}"
|
||||
|
||||
if [[ "$MODELS_MODE" != "both" && "$MODELS_MODE" != "openai" && "$MODELS_MODE" != "anthropic" ]]; then
|
||||
echo "ERROR: CLAWDBOT_E2E_MODELS must be one of: both|openai|anthropic" >&2
|
||||
echo "ERROR: OPENCLAW_E2E_MODELS must be one of: both|openai|anthropic" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if [[ "$MODELS_MODE" == "both" ]]; then
|
||||
if [[ -z "$OPENAI_API_KEY" ]]; then
|
||||
echo "ERROR: CLAWDBOT_E2E_MODELS=both requires OPENAI_API_KEY." >&2
|
||||
echo "ERROR: OPENCLAW_E2E_MODELS=both requires OPENAI_API_KEY." >&2
|
||||
exit 2
|
||||
fi
|
||||
if [[ -z "$ANTHROPIC_API_TOKEN" && -z "$ANTHROPIC_API_KEY" ]]; then
|
||||
echo "ERROR: CLAWDBOT_E2E_MODELS=both requires ANTHROPIC_API_TOKEN or ANTHROPIC_API_KEY." >&2
|
||||
echo "ERROR: OPENCLAW_E2E_MODELS=both requires ANTHROPIC_API_TOKEN or ANTHROPIC_API_KEY." >&2
|
||||
exit 2
|
||||
fi
|
||||
elif [[ "$MODELS_MODE" == "openai" && -z "$OPENAI_API_KEY" ]]; then
|
||||
echo "ERROR: CLAWDBOT_E2E_MODELS=openai requires OPENAI_API_KEY." >&2
|
||||
echo "ERROR: OPENCLAW_E2E_MODELS=openai requires OPENAI_API_KEY." >&2
|
||||
exit 2
|
||||
elif [[ "$MODELS_MODE" == "anthropic" && -z "$ANTHROPIC_API_TOKEN" && -z "$ANTHROPIC_API_KEY" ]]; then
|
||||
echo "ERROR: CLAWDBOT_E2E_MODELS=anthropic requires ANTHROPIC_API_TOKEN or ANTHROPIC_API_KEY." >&2
|
||||
echo "ERROR: OPENCLAW_E2E_MODELS=anthropic requires ANTHROPIC_API_TOKEN or ANTHROPIC_API_KEY." >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
echo "==> Resolve npm versions"
|
||||
EXPECTED_VERSION="$(npm view "moltbot@${INSTALL_TAG}" version)"
|
||||
EXPECTED_VERSION="$(npm view "openclaw@${INSTALL_TAG}" version)"
|
||||
if [[ -z "$EXPECTED_VERSION" || "$EXPECTED_VERSION" == "undefined" || "$EXPECTED_VERSION" == "null" ]]; then
|
||||
echo "ERROR: unable to resolve moltbot@${INSTALL_TAG} version" >&2
|
||||
echo "ERROR: unable to resolve openclaw@${INSTALL_TAG} version" >&2
|
||||
exit 2
|
||||
fi
|
||||
if [[ -n "$E2E_PREVIOUS_VERSION" ]]; then
|
||||
@@ -43,7 +43,7 @@ if [[ -n "$E2E_PREVIOUS_VERSION" ]]; then
|
||||
else
|
||||
PREVIOUS_VERSION="$(node - <<'NODE'
|
||||
const { execSync } = require("node:child_process");
|
||||
const versions = JSON.parse(execSync("npm view moltbot versions --json", { encoding: "utf8" }));
|
||||
const versions = JSON.parse(execSync("npm view openclaw versions --json", { encoding: "utf8" }));
|
||||
if (!Array.isArray(versions) || versions.length === 0) process.exit(1);
|
||||
process.stdout.write(versions.length >= 2 ? versions[versions.length - 2] : versions[0]);
|
||||
NODE
|
||||
@@ -52,26 +52,26 @@ fi
|
||||
echo "expected=$EXPECTED_VERSION previous=$PREVIOUS_VERSION"
|
||||
|
||||
if [[ "$SKIP_PREVIOUS" == "1" ]]; then
|
||||
echo "==> Skip preinstall previous (CLAWDBOT_INSTALL_E2E_SKIP_PREVIOUS=1)"
|
||||
echo "==> Skip preinstall previous (OPENCLAW_INSTALL_E2E_SKIP_PREVIOUS=1)"
|
||||
else
|
||||
echo "==> Preinstall previous (forces installer upgrade path; avoids read() prompt)"
|
||||
npm install -g "moltbot@${PREVIOUS_VERSION}"
|
||||
npm install -g "openclaw@${PREVIOUS_VERSION}"
|
||||
fi
|
||||
|
||||
echo "==> Run official installer one-liner"
|
||||
if [[ "$INSTALL_TAG" == "beta" ]]; then
|
||||
CLAWDBOT_BETA=1 curl -fsSL "$INSTALL_URL" | bash
|
||||
OPENCLAW_BETA=1 CLAWDBOT_BETA=1 curl -fsSL "$INSTALL_URL" | bash
|
||||
elif [[ "$INSTALL_TAG" != "latest" ]]; then
|
||||
CLAWDBOT_VERSION="$INSTALL_TAG" curl -fsSL "$INSTALL_URL" | bash
|
||||
OPENCLAW_VERSION="$INSTALL_TAG" CLAWDBOT_VERSION="$INSTALL_TAG" curl -fsSL "$INSTALL_URL" | bash
|
||||
else
|
||||
curl -fsSL "$INSTALL_URL" | bash
|
||||
fi
|
||||
|
||||
echo "==> Verify installed version"
|
||||
INSTALLED_VERSION="$(moltbot --version 2>/dev/null | head -n 1 | tr -d '\r')"
|
||||
INSTALLED_VERSION="$(openclaw --version 2>/dev/null | head -n 1 | tr -d '\r')"
|
||||
echo "installed=$INSTALLED_VERSION expected=$EXPECTED_VERSION"
|
||||
if [[ "$INSTALLED_VERSION" != "$EXPECTED_VERSION" ]]; then
|
||||
echo "ERROR: expected moltbot@$EXPECTED_VERSION, got moltbot@$INSTALLED_VERSION" >&2
|
||||
echo "ERROR: expected openclaw@$EXPECTED_VERSION, got openclaw@$INSTALLED_VERSION" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -80,7 +80,7 @@ set_image_model() {
|
||||
shift
|
||||
local candidate
|
||||
for candidate in "$@"; do
|
||||
if moltbot --profile "$profile" models set-image "$candidate" >/dev/null 2>&1; then
|
||||
if openclaw --profile "$profile" models set-image "$candidate" >/dev/null 2>&1; then
|
||||
echo "$candidate"
|
||||
return 0
|
||||
fi
|
||||
@@ -94,7 +94,7 @@ set_agent_model() {
|
||||
local candidate
|
||||
shift
|
||||
for candidate in "$@"; do
|
||||
if moltbot --profile "$profile" models set "$candidate" >/dev/null 2>&1; then
|
||||
if openclaw --profile "$profile" models set "$candidate" >/dev/null 2>&1; then
|
||||
echo "$candidate"
|
||||
return 0
|
||||
fi
|
||||
@@ -177,7 +177,7 @@ run_agent_turn() {
|
||||
local session_id="$2"
|
||||
local prompt="$3"
|
||||
local out_json="$4"
|
||||
moltbot --profile "$profile" agent \
|
||||
openclaw --profile "$profile" agent \
|
||||
--session-id "$session_id" \
|
||||
--message "$prompt" \
|
||||
--thinking off \
|
||||
@@ -339,7 +339,7 @@ run_profile() {
|
||||
|
||||
echo "==> Onboard ($profile)"
|
||||
if [[ "$agent_model_provider" == "openai" ]]; then
|
||||
moltbot --profile "$profile" onboard \
|
||||
openclaw --profile "$profile" onboard \
|
||||
--non-interactive \
|
||||
--accept-risk \
|
||||
--flow quickstart \
|
||||
@@ -351,7 +351,7 @@ run_profile() {
|
||||
--workspace "$workspace" \
|
||||
--skip-health
|
||||
elif [[ -n "$ANTHROPIC_API_TOKEN" ]]; then
|
||||
moltbot --profile "$profile" onboard \
|
||||
openclaw --profile "$profile" onboard \
|
||||
--non-interactive \
|
||||
--accept-risk \
|
||||
--flow quickstart \
|
||||
@@ -364,7 +364,7 @@ run_profile() {
|
||||
--workspace "$workspace" \
|
||||
--skip-health
|
||||
else
|
||||
moltbot --profile "$profile" onboard \
|
||||
openclaw --profile "$profile" onboard \
|
||||
--non-interactive \
|
||||
--accept-risk \
|
||||
--flow quickstart \
|
||||
@@ -416,7 +416,7 @@ run_profile() {
|
||||
IMAGE_PNG="$workspace/proof.png"
|
||||
IMAGE_TXT="$workspace/image.txt"
|
||||
SESSION_ID="e2e-tools-${profile}"
|
||||
SESSION_JSONL="/root/.clawdbot-${profile}/agents/main/sessions/${SESSION_ID}.jsonl"
|
||||
SESSION_JSONL="/root/.openclaw-${profile}/agents/main/sessions/${SESSION_ID}.jsonl"
|
||||
|
||||
PROOF_VALUE="$(node -e 'console.log(require("node:crypto").randomBytes(16).toString("hex"))')"
|
||||
echo -n "$PROOF_VALUE" >"$PROOF_TXT"
|
||||
@@ -425,7 +425,7 @@ run_profile() {
|
||||
|
||||
echo "==> Start gateway ($profile)"
|
||||
GATEWAY_LOG="$workspace/gateway.log"
|
||||
moltbot --profile "$profile" gateway --port "$port" --bind loopback >"$GATEWAY_LOG" 2>&1 &
|
||||
openclaw --profile "$profile" gateway --port "$port" --bind loopback >"$GATEWAY_LOG" 2>&1 &
|
||||
GATEWAY_PID="$!"
|
||||
cleanup_profile() {
|
||||
if kill -0 "$GATEWAY_PID" 2>/dev/null; then
|
||||
@@ -437,12 +437,12 @@ run_profile() {
|
||||
|
||||
echo "==> Wait for health ($profile)"
|
||||
for _ in $(seq 1 60); do
|
||||
if moltbot --profile "$profile" health --timeout 2000 --json >/dev/null 2>&1; then
|
||||
if openclaw --profile "$profile" health --timeout 2000 --json >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 0.25
|
||||
done
|
||||
moltbot --profile "$profile" health --timeout 10000 --json >/dev/null
|
||||
openclaw --profile "$profile" health --timeout 10000 --json >/dev/null
|
||||
|
||||
echo "==> Agent turns ($profile)"
|
||||
TURN1_JSON="/tmp/agent-${profile}-1.json"
|
||||
@@ -511,7 +511,7 @@ run_profile() {
|
||||
sleep 1
|
||||
if [[ ! -f "$SESSION_JSONL" ]]; then
|
||||
echo "ERROR: missing session transcript ($profile): $SESSION_JSONL" >&2
|
||||
ls -la "/root/.clawdbot-${profile}/agents/main/sessions" >&2 || true
|
||||
ls -la "/root/.openclaw-${profile}/agents/main/sessions" >&2 || true
|
||||
exit 1
|
||||
fi
|
||||
assert_session_used_tools "$SESSION_JSONL" read write exec image
|
||||
@@ -521,11 +521,11 @@ run_profile() {
|
||||
}
|
||||
|
||||
if [[ "$MODELS_MODE" == "openai" || "$MODELS_MODE" == "both" ]]; then
|
||||
run_profile "e2e-openai" "18789" "/tmp/clawd-e2e-openai" "openai"
|
||||
run_profile "e2e-openai" "18789" "/tmp/openclaw-e2e-openai" "openai"
|
||||
fi
|
||||
|
||||
if [[ "$MODELS_MODE" == "anthropic" || "$MODELS_MODE" == "both" ]]; then
|
||||
run_profile "e2e-anthropic" "18799" "/tmp/clawd-e2e-anthropic" "anthropic"
|
||||
run_profile "e2e-anthropic" "18799" "/tmp/openclaw-e2e-anthropic" "anthropic"
|
||||
fi
|
||||
|
||||
echo "OK"
|
||||
|
||||
@@ -23,7 +23,7 @@ WORKDIR /home/app
|
||||
ENV NPM_CONFIG_FUND=false
|
||||
ENV NPM_CONFIG_AUDIT=false
|
||||
|
||||
COPY run.sh /usr/local/bin/moltbot-install-nonroot
|
||||
RUN sudo chmod +x /usr/local/bin/moltbot-install-nonroot
|
||||
COPY run.sh /usr/local/bin/openclaw-install-nonroot
|
||||
RUN sudo chmod +x /usr/local/bin/openclaw-install-nonroot
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/moltbot-install-nonroot"]
|
||||
ENTRYPOINT ["/usr/local/bin/openclaw-install-nonroot"]
|
||||
|
||||
@@ -1,17 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://molt.bot/install.sh}"
|
||||
DEFAULT_PACKAGE="moltbot"
|
||||
if [[ -z "${CLAWDBOT_INSTALL_PACKAGE:-}" && "$INSTALL_URL" == *"clawd.bot"* ]]; then
|
||||
DEFAULT_PACKAGE="clawdbot"
|
||||
fi
|
||||
PACKAGE_NAME="${CLAWDBOT_INSTALL_PACKAGE:-$DEFAULT_PACKAGE}"
|
||||
if [[ "$PACKAGE_NAME" == "moltbot" ]]; then
|
||||
ALT_PACKAGE_NAME="clawdbot"
|
||||
else
|
||||
ALT_PACKAGE_NAME="moltbot"
|
||||
fi
|
||||
INSTALL_URL="${OPENCLAW_INSTALL_URL:-https://openclaw.bot/install.sh}"
|
||||
DEFAULT_PACKAGE="openclaw"
|
||||
PACKAGE_NAME="${OPENCLAW_INSTALL_PACKAGE:-$DEFAULT_PACKAGE}"
|
||||
|
||||
echo "==> Pre-flight: ensure git absent"
|
||||
if command -v git >/dev/null; then
|
||||
@@ -28,7 +20,7 @@ export PATH="$HOME/.npm-global/bin:$PATH"
|
||||
echo "==> Verify git installed"
|
||||
command -v git >/dev/null
|
||||
|
||||
EXPECTED_VERSION="${CLAWDBOT_INSTALL_EXPECT_VERSION:-}"
|
||||
EXPECTED_VERSION="${OPENCLAW_INSTALL_EXPECT_VERSION:-}"
|
||||
if [[ -n "$EXPECTED_VERSION" ]]; then
|
||||
LATEST_VERSION="$EXPECTED_VERSION"
|
||||
else
|
||||
@@ -36,25 +28,14 @@ else
|
||||
fi
|
||||
CLI_NAME="$PACKAGE_NAME"
|
||||
CMD_PATH="$(command -v "$CLI_NAME" || true)"
|
||||
if [[ -z "$CMD_PATH" ]]; then
|
||||
CLI_NAME="$ALT_PACKAGE_NAME"
|
||||
CMD_PATH="$(command -v "$CLI_NAME" || true)"
|
||||
fi
|
||||
if [[ -z "$CMD_PATH" && -x "$HOME/.npm-global/bin/$PACKAGE_NAME" ]]; then
|
||||
CLI_NAME="$PACKAGE_NAME"
|
||||
CMD_PATH="$HOME/.npm-global/bin/$PACKAGE_NAME"
|
||||
fi
|
||||
if [[ -z "$CMD_PATH" && -x "$HOME/.npm-global/bin/$ALT_PACKAGE_NAME" ]]; then
|
||||
CLI_NAME="$ALT_PACKAGE_NAME"
|
||||
CMD_PATH="$HOME/.npm-global/bin/$ALT_PACKAGE_NAME"
|
||||
fi
|
||||
if [[ -z "$CMD_PATH" ]]; then
|
||||
echo "Neither $PACKAGE_NAME nor $ALT_PACKAGE_NAME is on PATH" >&2
|
||||
echo "$PACKAGE_NAME is not on PATH" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ -z "$EXPECTED_VERSION" && "$CLI_NAME" != "$PACKAGE_NAME" ]]; then
|
||||
LATEST_VERSION="$(npm view "$CLI_NAME" version)"
|
||||
fi
|
||||
echo "==> Verify CLI installed: $CLI_NAME"
|
||||
INSTALLED_VERSION="$("$CMD_PATH" --version 2>/dev/null | head -n 1 | tr -d '\r')"
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ RUN set -eux; \
|
||||
sudo \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY run.sh /usr/local/bin/moltbot-install-smoke
|
||||
RUN chmod +x /usr/local/bin/moltbot-install-smoke
|
||||
COPY run.sh /usr/local/bin/openclaw-install-smoke
|
||||
RUN chmod +x /usr/local/bin/openclaw-install-smoke
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/moltbot-install-smoke"]
|
||||
ENTRYPOINT ["/usr/local/bin/openclaw-install-smoke"]
|
||||
|
||||
@@ -1,19 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://molt.bot/install.sh}"
|
||||
SMOKE_PREVIOUS_VERSION="${CLAWDBOT_INSTALL_SMOKE_PREVIOUS:-}"
|
||||
SKIP_PREVIOUS="${CLAWDBOT_INSTALL_SMOKE_SKIP_PREVIOUS:-0}"
|
||||
DEFAULT_PACKAGE="moltbot"
|
||||
if [[ -z "${CLAWDBOT_INSTALL_PACKAGE:-}" && "$INSTALL_URL" == *"clawd.bot"* ]]; then
|
||||
DEFAULT_PACKAGE="clawdbot"
|
||||
fi
|
||||
PACKAGE_NAME="${CLAWDBOT_INSTALL_PACKAGE:-$DEFAULT_PACKAGE}"
|
||||
if [[ "$PACKAGE_NAME" == "moltbot" ]]; then
|
||||
ALT_PACKAGE_NAME="clawdbot"
|
||||
else
|
||||
ALT_PACKAGE_NAME="moltbot"
|
||||
fi
|
||||
INSTALL_URL="${OPENCLAW_INSTALL_URL:-https://openclaw.bot/install.sh}"
|
||||
SMOKE_PREVIOUS_VERSION="${OPENCLAW_INSTALL_SMOKE_PREVIOUS:-}"
|
||||
SKIP_PREVIOUS="${OPENCLAW_INSTALL_SMOKE_SKIP_PREVIOUS:-0}"
|
||||
DEFAULT_PACKAGE="openclaw"
|
||||
PACKAGE_NAME="${OPENCLAW_INSTALL_PACKAGE:-$DEFAULT_PACKAGE}"
|
||||
|
||||
echo "==> Resolve npm versions"
|
||||
LATEST_VERSION="$(npm view "$PACKAGE_NAME" version)"
|
||||
@@ -49,7 +41,7 @@ fi
|
||||
echo "package=$PACKAGE_NAME latest=$LATEST_VERSION previous=$PREVIOUS_VERSION"
|
||||
|
||||
if [[ "$SKIP_PREVIOUS" == "1" ]]; then
|
||||
echo "==> Skip preinstall previous (CLAWDBOT_INSTALL_SMOKE_SKIP_PREVIOUS=1)"
|
||||
echo "==> Skip preinstall previous (OPENCLAW_INSTALL_SMOKE_SKIP_PREVIOUS=1)"
|
||||
else
|
||||
echo "==> Preinstall previous (forces installer upgrade path)"
|
||||
npm install -g "${PACKAGE_NAME}@${PREVIOUS_VERSION}"
|
||||
@@ -61,17 +53,11 @@ curl -fsSL "$INSTALL_URL" | bash
|
||||
echo "==> Verify installed version"
|
||||
CLI_NAME="$PACKAGE_NAME"
|
||||
if ! command -v "$CLI_NAME" >/dev/null 2>&1; then
|
||||
if command -v "$ALT_PACKAGE_NAME" >/dev/null 2>&1; then
|
||||
CLI_NAME="$ALT_PACKAGE_NAME"
|
||||
LATEST_VERSION="$(npm view "$CLI_NAME" version)"
|
||||
echo "==> Detected alternate CLI: $CLI_NAME"
|
||||
else
|
||||
echo "ERROR: neither $PACKAGE_NAME nor $ALT_PACKAGE_NAME is on PATH" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "ERROR: $PACKAGE_NAME is not on PATH" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ -n "${CLAWDBOT_INSTALL_LATEST_OUT:-}" ]]; then
|
||||
printf "%s" "$LATEST_VERSION" > "$CLAWDBOT_INSTALL_LATEST_OUT"
|
||||
if [[ -n "${OPENCLAW_INSTALL_LATEST_OUT:-}" ]]; then
|
||||
printf "%s" "$LATEST_VERSION" > "${OPENCLAW_INSTALL_LATEST_OUT:-}"
|
||||
fi
|
||||
INSTALLED_VERSION="$("$CLI_NAME" --version 2>/dev/null | head -n 1 | tr -d '\r')"
|
||||
echo "cli=$CLI_NAME installed=$INSTALLED_VERSION expected=$LATEST_VERSION"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
IMAGE_NAME="moltbot-doctor-install-switch-e2e"
|
||||
IMAGE_NAME="openclaw-doctor-install-switch-e2e"
|
||||
|
||||
echo "Building Docker image..."
|
||||
docker build -t "$IMAGE_NAME" -f "$ROOT_DIR/scripts/e2e/Dockerfile" "$ROOT_DIR"
|
||||
@@ -17,10 +17,10 @@ docker run --rm -t "$IMAGE_NAME" bash -lc '
|
||||
export npm_config_audit=false
|
||||
|
||||
# Stub systemd/loginctl so doctor + daemon flows work in Docker.
|
||||
export PATH="/tmp/moltbot-bin:$PATH"
|
||||
mkdir -p /tmp/moltbot-bin
|
||||
export PATH="/tmp/openclaw-bin:$PATH"
|
||||
mkdir -p /tmp/openclaw-bin
|
||||
|
||||
cat > /tmp/moltbot-bin/systemctl <<"SYSTEMCTL"
|
||||
cat > /tmp/openclaw-bin/systemctl <<"SYSTEMCTL"
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
@@ -54,9 +54,9 @@ case "$cmd" in
|
||||
;;
|
||||
esac
|
||||
SYSTEMCTL
|
||||
chmod +x /tmp/moltbot-bin/systemctl
|
||||
chmod +x /tmp/openclaw-bin/systemctl
|
||||
|
||||
cat > /tmp/moltbot-bin/loginctl <<"LOGINCTL"
|
||||
cat > /tmp/openclaw-bin/loginctl <<"LOGINCTL"
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
@@ -69,7 +69,7 @@ if [[ "$*" == *"enable-linger"* ]]; then
|
||||
fi
|
||||
exit 0
|
||||
LOGINCTL
|
||||
chmod +x /tmp/moltbot-bin/loginctl
|
||||
chmod +x /tmp/openclaw-bin/loginctl
|
||||
|
||||
# Install the npm-global variant from the local /app source.
|
||||
# `npm pack` can emit script output; keep only the tarball name.
|
||||
@@ -80,9 +80,9 @@ LOGINCTL
|
||||
fi
|
||||
npm install -g --prefix /tmp/npm-prefix "/app/$pkg_tgz"
|
||||
|
||||
npm_bin="/tmp/npm-prefix/bin/moltbot"
|
||||
npm_entry="/tmp/npm-prefix/lib/node_modules/moltbot/moltbot.mjs"
|
||||
git_entry="/app/moltbot.mjs"
|
||||
npm_bin="/tmp/npm-prefix/bin/openclaw"
|
||||
npm_entry="/tmp/npm-prefix/lib/node_modules/openclaw/openclaw.mjs"
|
||||
git_entry="/app/openclaw.mjs"
|
||||
|
||||
assert_entrypoint() {
|
||||
local unit_path="$1"
|
||||
@@ -113,13 +113,13 @@ LOGINCTL
|
||||
local doctor_expected="$5"
|
||||
|
||||
echo "== Flow: $name =="
|
||||
home_dir=$(mktemp -d "/tmp/moltbot-switch-${name}.XXXXXX")
|
||||
home_dir=$(mktemp -d "/tmp/openclaw-switch-${name}.XXXXXX")
|
||||
export HOME="$home_dir"
|
||||
export USER="testuser"
|
||||
|
||||
eval "$install_cmd"
|
||||
|
||||
unit_path="$HOME/.config/systemd/user/moltbot-gateway.service"
|
||||
unit_path="$HOME/.config/systemd/user/openclaw-gateway.service"
|
||||
if [ ! -f "$unit_path" ]; then
|
||||
echo "Missing unit file: $unit_path"
|
||||
exit 1
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
IMAGE_NAME="moltbot-gateway-network-e2e"
|
||||
IMAGE_NAME="openclaw-gateway-network-e2e"
|
||||
|
||||
PORT="18789"
|
||||
TOKEN="e2e-$(date +%s)-$$"
|
||||
NET_NAME="moltbot-net-e2e-$$"
|
||||
GW_NAME="moltbot-gateway-e2e-$$"
|
||||
NET_NAME="openclaw-net-e2e-$$"
|
||||
GW_NAME="openclaw-gateway-e2e-$$"
|
||||
|
||||
cleanup() {
|
||||
docker rm -f "$GW_NAME" >/dev/null 2>&1 || true
|
||||
@@ -25,11 +25,11 @@ echo "Starting gateway container..."
|
||||
docker run --rm -d \
|
||||
--name "$GW_NAME" \
|
||||
--network "$NET_NAME" \
|
||||
-e "CLAWDBOT_GATEWAY_TOKEN=$TOKEN" \
|
||||
-e "CLAWDBOT_SKIP_CHANNELS=1" \
|
||||
-e "CLAWDBOT_SKIP_GMAIL_WATCHER=1" \
|
||||
-e "CLAWDBOT_SKIP_CRON=1" \
|
||||
-e "CLAWDBOT_SKIP_CANVAS_HOST=1" \
|
||||
-e "OPENCLAW_GATEWAY_TOKEN=$TOKEN" \
|
||||
-e "OPENCLAW_SKIP_CHANNELS=1" \
|
||||
-e "OPENCLAW_SKIP_GMAIL_WATCHER=1" \
|
||||
-e "OPENCLAW_SKIP_CRON=1" \
|
||||
-e "OPENCLAW_SKIP_CANVAS_HOST=1" \
|
||||
"$IMAGE_NAME" \
|
||||
bash -lc "node dist/index.js gateway --port $PORT --bind lan --allow-unconfigured > /tmp/gateway-net-e2e.log 2>&1"
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
IMAGE_NAME="moltbot-onboard-e2e"
|
||||
IMAGE_NAME="openclaw-onboard-e2e"
|
||||
|
||||
echo "Building Docker image..."
|
||||
docker build -t "$IMAGE_NAME" -f "$ROOT_DIR/scripts/e2e/Dockerfile" "$ROOT_DIR"
|
||||
@@ -15,9 +15,9 @@ docker run --rm -t "$IMAGE_NAME" bash -lc '
|
||||
ONBOARD_FLAGS="--flow quickstart --auth-choice skip --skip-channels --skip-skills --skip-daemon --skip-ui"
|
||||
|
||||
# Provide a minimal trash shim to avoid noisy "missing trash" logs in containers.
|
||||
export PATH="/tmp/moltbot-bin:$PATH"
|
||||
mkdir -p /tmp/moltbot-bin
|
||||
cat > /tmp/moltbot-bin/trash <<'"'"'TRASH'"'"'
|
||||
export PATH="/tmp/openclaw-bin:$PATH"
|
||||
mkdir -p /tmp/openclaw-bin
|
||||
cat > /tmp/openclaw-bin/trash <<'"'"'TRASH'"'"'
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
trash_dir="$HOME/.Trash"
|
||||
@@ -32,7 +32,7 @@ for target in "$@"; do
|
||||
mv "$target" "$dest"
|
||||
done
|
||||
TRASH
|
||||
chmod +x /tmp/moltbot-bin/trash
|
||||
chmod +x /tmp/openclaw-bin/trash
|
||||
|
||||
send() {
|
||||
local payload="$1"
|
||||
@@ -140,9 +140,9 @@ TRASH
|
||||
export HOME="$home_dir"
|
||||
mkdir -p "$HOME"
|
||||
|
||||
input_fifo="$(mktemp -u "/tmp/moltbot-onboard-${case_name}.XXXXXX")"
|
||||
input_fifo="$(mktemp -u "/tmp/openclaw-onboard-${case_name}.XXXXXX")"
|
||||
mkfifo "$input_fifo"
|
||||
local log_path="/tmp/moltbot-onboard-${case_name}.log"
|
||||
local log_path="/tmp/openclaw-onboard-${case_name}.log"
|
||||
WIZARD_LOG_PATH="$log_path"
|
||||
export WIZARD_LOG_PATH
|
||||
# Run under script to keep an interactive TTY for clack prompts.
|
||||
@@ -189,7 +189,7 @@ TRASH
|
||||
}
|
||||
|
||||
make_home() {
|
||||
mktemp -d "/tmp/moltbot-e2e-$1.XXXXXX"
|
||||
mktemp -d "/tmp/openclaw-e2e-$1.XXXXXX"
|
||||
}
|
||||
|
||||
assert_file() {
|
||||
@@ -280,9 +280,9 @@ TRASH
|
||||
--skip-health
|
||||
|
||||
# Assert config + workspace scaffolding.
|
||||
workspace_dir="$HOME/clawd"
|
||||
config_path="$HOME/.clawdbot/moltbot.json"
|
||||
sessions_dir="$HOME/.clawdbot/agents/main/sessions"
|
||||
workspace_dir="$HOME/openclaw"
|
||||
config_path="$HOME/.openclaw/openclaw.json"
|
||||
sessions_dir="$HOME/.openclaw/agents/main/sessions"
|
||||
|
||||
assert_file "$config_path"
|
||||
assert_dir "$sessions_dir"
|
||||
@@ -352,7 +352,7 @@ NODE
|
||||
--skip-skills \
|
||||
--skip-health
|
||||
|
||||
config_path="$HOME/.clawdbot/moltbot.json"
|
||||
config_path="$HOME/.openclaw/openclaw.json"
|
||||
assert_file "$config_path"
|
||||
|
||||
CONFIG_PATH="$config_path" node --input-type=module - <<'"'"'NODE'"'"'
|
||||
@@ -386,9 +386,9 @@ NODE
|
||||
local home_dir
|
||||
home_dir="$(make_home reset-config)"
|
||||
export HOME="$home_dir"
|
||||
mkdir -p "$HOME/.clawdbot"
|
||||
mkdir -p "$HOME/.openclaw"
|
||||
# Seed a remote config to exercise reset path.
|
||||
cat > "$HOME/.clawdbot/moltbot.json" <<'"'"'JSON'"'"'
|
||||
cat > "$HOME/.openclaw/openclaw.json" <<'"'"'JSON'"'"'
|
||||
{
|
||||
"agents": { "defaults": { "workspace": "/root/old" } },
|
||||
"gateway": {
|
||||
@@ -410,7 +410,7 @@ JSON
|
||||
--skip-ui \
|
||||
--skip-health
|
||||
|
||||
config_path="$HOME/.clawdbot/moltbot.json"
|
||||
config_path="$HOME/.openclaw/openclaw.json"
|
||||
assert_file "$config_path"
|
||||
|
||||
CONFIG_PATH="$config_path" node --input-type=module - <<'"'"'NODE'"'"'
|
||||
@@ -443,7 +443,7 @@ NODE
|
||||
# Channels-only configure flow.
|
||||
run_wizard_cmd channels "$home_dir" "node dist/index.js configure --section channels" send_channels_flow
|
||||
|
||||
config_path="$HOME/.clawdbot/moltbot.json"
|
||||
config_path="$HOME/.openclaw/openclaw.json"
|
||||
assert_file "$config_path"
|
||||
|
||||
CONFIG_PATH="$config_path" node --input-type=module - <<'"'"'NODE'"'"'
|
||||
@@ -481,9 +481,9 @@ NODE
|
||||
local home_dir
|
||||
home_dir="$(make_home skills)"
|
||||
export HOME="$home_dir"
|
||||
mkdir -p "$HOME/.clawdbot"
|
||||
mkdir -p "$HOME/.openclaw"
|
||||
# Seed skills config to ensure it survives the wizard.
|
||||
cat > "$HOME/.clawdbot/moltbot.json" <<'"'"'JSON'"'"'
|
||||
cat > "$HOME/.openclaw/openclaw.json" <<'"'"'JSON'"'"'
|
||||
{
|
||||
"skills": {
|
||||
"allowBundled": ["__none__"],
|
||||
@@ -494,7 +494,7 @@ JSON
|
||||
|
||||
run_wizard_cmd skills "$home_dir" "node dist/index.js configure --section skills" send_skills_flow
|
||||
|
||||
config_path="$HOME/.clawdbot/moltbot.json"
|
||||
config_path="$HOME/.openclaw/openclaw.json"
|
||||
assert_file "$config_path"
|
||||
|
||||
CONFIG_PATH="$config_path" node --input-type=module - <<'"'"'NODE'"'"'
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
IMAGE_NAME="moltbot-plugins-e2e"
|
||||
IMAGE_NAME="openclaw-plugins-e2e"
|
||||
|
||||
echo "Building Docker image..."
|
||||
docker build -t "$IMAGE_NAME" -f "$ROOT_DIR/scripts/e2e/Dockerfile" "$ROOT_DIR"
|
||||
@@ -11,11 +11,11 @@ echo "Running plugins Docker E2E..."
|
||||
docker run --rm -t "$IMAGE_NAME" bash -lc '
|
||||
set -euo pipefail
|
||||
|
||||
home_dir=$(mktemp -d "/tmp/moltbot-plugins-e2e.XXXXXX")
|
||||
home_dir=$(mktemp -d "/tmp/openclaw-plugins-e2e.XXXXXX")
|
||||
export HOME="$home_dir"
|
||||
mkdir -p "$HOME/.clawdbot/extensions"
|
||||
mkdir -p "$HOME/.openclaw/extensions"
|
||||
|
||||
cat > "$HOME/.clawdbot/extensions/demo-plugin.js" <<'"'"'JS'"'"'
|
||||
cat > "$HOME/.openclaw/extensions/demo-plugin.js" <<'"'"'JS'"'"'
|
||||
module.exports = {
|
||||
id: "demo-plugin",
|
||||
name: "Demo Plugin",
|
||||
@@ -61,13 +61,13 @@ console.log("ok");
|
||||
NODE
|
||||
|
||||
echo "Testing tgz install flow..."
|
||||
pack_dir="$(mktemp -d "/tmp/moltbot-plugin-pack.XXXXXX")"
|
||||
pack_dir="$(mktemp -d "/tmp/openclaw-plugin-pack.XXXXXX")"
|
||||
mkdir -p "$pack_dir/package"
|
||||
cat > "$pack_dir/package/package.json" <<'"'"'JSON'"'"'
|
||||
{
|
||||
"name": "@moltbot/demo-plugin-tgz",
|
||||
"name": "@openclaw/demo-plugin-tgz",
|
||||
"version": "0.0.1",
|
||||
"moltbot": { "extensions": ["./index.js"] }
|
||||
"openclaw": { "extensions": ["./index.js"] }
|
||||
}
|
||||
JSON
|
||||
cat > "$pack_dir/package/index.js" <<'"'"'JS'"'"'
|
||||
@@ -100,12 +100,12 @@ console.log("ok");
|
||||
NODE
|
||||
|
||||
echo "Testing install from local folder (plugins.load.paths)..."
|
||||
dir_plugin="$(mktemp -d "/tmp/moltbot-plugin-dir.XXXXXX")"
|
||||
dir_plugin="$(mktemp -d "/tmp/openclaw-plugin-dir.XXXXXX")"
|
||||
cat > "$dir_plugin/package.json" <<'"'"'JSON'"'"'
|
||||
{
|
||||
"name": "@moltbot/demo-plugin-dir",
|
||||
"name": "@openclaw/demo-plugin-dir",
|
||||
"version": "0.0.1",
|
||||
"moltbot": { "extensions": ["./index.js"] }
|
||||
"openclaw": { "extensions": ["./index.js"] }
|
||||
}
|
||||
JSON
|
||||
cat > "$dir_plugin/index.js" <<'"'"'JS'"'"'
|
||||
@@ -137,13 +137,13 @@ console.log("ok");
|
||||
NODE
|
||||
|
||||
echo "Testing install from npm spec (file:)..."
|
||||
file_pack_dir="$(mktemp -d "/tmp/moltbot-plugin-filepack.XXXXXX")"
|
||||
file_pack_dir="$(mktemp -d "/tmp/openclaw-plugin-filepack.XXXXXX")"
|
||||
mkdir -p "$file_pack_dir/package"
|
||||
cat > "$file_pack_dir/package/package.json" <<'"'"'JSON'"'"'
|
||||
{
|
||||
"name": "@moltbot/demo-plugin-file",
|
||||
"name": "@openclaw/demo-plugin-file",
|
||||
"version": "0.0.1",
|
||||
"moltbot": { "extensions": ["./index.js"] }
|
||||
"openclaw": { "extensions": ["./index.js"] }
|
||||
}
|
||||
JSON
|
||||
cat > "$file_pack_dir/package/index.js" <<'"'"'JS'"'"'
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
IMAGE_NAME="${CLAWDBOT_QR_SMOKE_IMAGE:-moltbot-qr-smoke}"
|
||||
IMAGE_NAME="${OPENCLAW_QR_SMOKE_IMAGE:-${CLAWDBOT_QR_SMOKE_IMAGE:-openclaw-qr-smoke}}"
|
||||
|
||||
echo "Building Docker image..."
|
||||
docker build -t "$IMAGE_NAME" -f "$ROOT_DIR/scripts/e2e/Dockerfile.qr-import" "$ROOT_DIR"
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT=$(cd "$(dirname "$0")/.." && pwd)
|
||||
ZIP=${1:?"Usage: $0 Moltbot-<ver>.zip"}
|
||||
FEED_URL=${2:-"https://raw.githubusercontent.com/moltbot/moltbot/main/appcast.xml"}
|
||||
ZIP=${1:?"Usage: $0 OpenClaw-<ver>.zip"}
|
||||
FEED_URL=${2:-"https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml"}
|
||||
PRIVATE_KEY_FILE=${SPARKLE_PRIVATE_KEY_FILE:-}
|
||||
if [[ -z "$PRIVATE_KEY_FILE" ]]; then
|
||||
echo "Set SPARKLE_PRIVATE_KEY_FILE to your ed25519 private key (Sparkle)." >&2
|
||||
@@ -19,7 +19,7 @@ ZIP_NAME=$(basename "$ZIP")
|
||||
ZIP_BASE="${ZIP_NAME%.zip}"
|
||||
VERSION=${SPARKLE_RELEASE_VERSION:-}
|
||||
if [[ -z "$VERSION" ]]; then
|
||||
if [[ "$ZIP_NAME" =~ ^Moltbot-([0-9]+(\.[0-9]+){1,2}([-.][^.]*)?)\.zip$ ]]; then
|
||||
if [[ "$ZIP_NAME" =~ ^OpenClaw-([0-9]+(\.[0-9]+){1,2}([-.][^.]*)?)\.zip$ ]]; then
|
||||
VERSION="${BASH_REMATCH[1]}"
|
||||
else
|
||||
echo "Could not infer version from $ZIP_NAME; set SPARKLE_RELEASE_VERSION." >&2
|
||||
@@ -49,7 +49,7 @@ else
|
||||
fi
|
||||
cp -f "$NOTES_HTML" "$TMP_DIR/${ZIP_BASE}.html"
|
||||
|
||||
DOWNLOAD_URL_PREFIX=${SPARKLE_DOWNLOAD_URL_PREFIX:-"https://github.com/moltbot/moltbot/releases/download/v${VERSION}/"}
|
||||
DOWNLOAD_URL_PREFIX=${SPARKLE_DOWNLOAD_URL_PREFIX:-"https://github.com/openclaw/openclaw/releases/download/v${VERSION}/"}
|
||||
|
||||
export PATH="$ROOT/apps/macos/.build/artifacts/sparkle/Sparkle/bin:$PATH"
|
||||
if ! command -v generate_appcast >/dev/null; then
|
||||
|
||||
@@ -32,7 +32,7 @@ case "$AUTH_STATUS" in
|
||||
"$SCRIPT_DIR/claude-auth-status.sh" full
|
||||
exit 0
|
||||
;;
|
||||
CLAUDE_EXPIRING|CLAWDBOT_EXPIRING)
|
||||
CLAUDE_EXPIRING|OPENCLAW_EXPIRING|CLAWDBOT_EXPIRING)
|
||||
echo -e "${YELLOW}Auth is expiring soon.${NC}"
|
||||
echo ""
|
||||
;;
|
||||
@@ -69,11 +69,11 @@ if claude setup-token; then
|
||||
echo ""
|
||||
"$SCRIPT_DIR/claude-auth-status.sh" full
|
||||
|
||||
# Restart moltbot service if running
|
||||
if systemctl --user is-active moltbot >/dev/null 2>&1; then
|
||||
# Restart openclaw service if running
|
||||
if systemctl --user is-active openclaw >/dev/null 2>&1; then
|
||||
echo ""
|
||||
echo "Restarting moltbot service..."
|
||||
systemctl --user restart moltbot
|
||||
echo "Restarting openclaw service..."
|
||||
systemctl --user restart openclaw
|
||||
echo -e "${GREEN}Service restarted.${NC}"
|
||||
fi
|
||||
else
|
||||
|
||||
@@ -4,7 +4,7 @@ set -euo pipefail
|
||||
# Notarize a macOS artifact (zip/dmg/pkg) and optionally staple the app bundle.
|
||||
#
|
||||
# Usage:
|
||||
# STAPLE_APP_PATH=dist/Moltbot.app scripts/notarize-mac-artifact.sh <artifact>
|
||||
# STAPLE_APP_PATH=dist/OpenClaw.app scripts/notarize-mac-artifact.sh <artifact>
|
||||
#
|
||||
# Auth (pick one):
|
||||
# NOTARYTOOL_PROFILE keychain profile created via `xcrun notarytool store-credentials`
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Build and bundle Moltbot into a minimal .app we can open.
|
||||
# Outputs to dist/Moltbot.app
|
||||
# Build and bundle OpenClaw into a minimal .app we can open.
|
||||
# Outputs to dist/OpenClaw.app
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
APP_ROOT="$ROOT_DIR/dist/Moltbot.app"
|
||||
APP_ROOT="$ROOT_DIR/dist/OpenClaw.app"
|
||||
BUILD_ROOT="$ROOT_DIR/apps/macos/.build"
|
||||
PRODUCT="Moltbot"
|
||||
BUNDLE_ID="${BUNDLE_ID:-bot.molt.mac.debug}"
|
||||
PRODUCT="OpenClaw"
|
||||
BUNDLE_ID="${BUNDLE_ID:-ai.openclaw.mac.debug}"
|
||||
PKG_VERSION="$(cd "$ROOT_DIR" && node -p "require('./package.json').version" 2>/dev/null || echo "0.0.0")"
|
||||
BUILD_TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||||
GIT_COMMIT=$(cd "$ROOT_DIR" && git rev-parse --short HEAD 2>/dev/null || echo "unknown")
|
||||
@@ -23,7 +23,7 @@ fi
|
||||
IFS=' ' read -r -a BUILD_ARCHS <<< "$BUILD_ARCHS_VALUE"
|
||||
PRIMARY_ARCH="${BUILD_ARCHS[0]}"
|
||||
SPARKLE_PUBLIC_ED_KEY="${SPARKLE_PUBLIC_ED_KEY:-AGCY8w5vHirVfGGDGc8Szc5iuOqupZSh9pMj/Qs67XI=}"
|
||||
SPARKLE_FEED_URL="${SPARKLE_FEED_URL:-https://raw.githubusercontent.com/moltbot/moltbot/main/appcast.xml}"
|
||||
SPARKLE_FEED_URL="${SPARKLE_FEED_URL:-https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml}"
|
||||
AUTO_CHECKS=true
|
||||
if [[ "$BUNDLE_ID" == *.debug ]]; then
|
||||
SPARKLE_FEED_URL=""
|
||||
@@ -140,7 +140,7 @@ mkdir -p "$APP_ROOT/Contents/Resources"
|
||||
mkdir -p "$APP_ROOT/Contents/Frameworks"
|
||||
|
||||
echo "📄 Copying Info.plist template"
|
||||
INFO_PLIST_SRC="$ROOT_DIR/apps/macos/Sources/Moltbot/Resources/Info.plist"
|
||||
INFO_PLIST_SRC="$ROOT_DIR/apps/macos/Sources/OpenClaw/Resources/Info.plist"
|
||||
if [ ! -f "$INFO_PLIST_SRC" ]; then
|
||||
echo "ERROR: Info.plist template missing at $INFO_PLIST_SRC" >&2
|
||||
exit 1
|
||||
@@ -149,8 +149,8 @@ cp "$INFO_PLIST_SRC" "$APP_ROOT/Contents/Info.plist"
|
||||
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier ${BUNDLE_ID}" "$APP_ROOT/Contents/Info.plist" || true
|
||||
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${APP_VERSION}" "$APP_ROOT/Contents/Info.plist" || true
|
||||
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${APP_BUILD}" "$APP_ROOT/Contents/Info.plist" || true
|
||||
/usr/libexec/PlistBuddy -c "Set :MoltbotBuildTimestamp ${BUILD_TS}" "$APP_ROOT/Contents/Info.plist" || true
|
||||
/usr/libexec/PlistBuddy -c "Set :MoltbotGitCommit ${GIT_COMMIT}" "$APP_ROOT/Contents/Info.plist" || true
|
||||
/usr/libexec/PlistBuddy -c "Set :OpenClawBuildTimestamp ${BUILD_TS}" "$APP_ROOT/Contents/Info.plist" || true
|
||||
/usr/libexec/PlistBuddy -c "Set :OpenClawGitCommit ${GIT_COMMIT}" "$APP_ROOT/Contents/Info.plist" || true
|
||||
/usr/libexec/PlistBuddy -c "Set :SUFeedURL ${SPARKLE_FEED_URL}" "$APP_ROOT/Contents/Info.plist" \
|
||||
|| /usr/libexec/PlistBuddy -c "Add :SUFeedURL string ${SPARKLE_FEED_URL}" "$APP_ROOT/Contents/Info.plist" || true
|
||||
/usr/libexec/PlistBuddy -c "Set :SUPublicEDKey ${SPARKLE_PUBLIC_ED_KEY}" "$APP_ROOT/Contents/Info.plist" \
|
||||
@@ -162,17 +162,17 @@ else
|
||||
fi
|
||||
|
||||
echo "🚚 Copying binary"
|
||||
cp "$BIN_PRIMARY" "$APP_ROOT/Contents/MacOS/Moltbot"
|
||||
cp "$BIN_PRIMARY" "$APP_ROOT/Contents/MacOS/OpenClaw"
|
||||
if [[ "${#BUILD_ARCHS[@]}" -gt 1 ]]; then
|
||||
BIN_INPUTS=()
|
||||
for arch in "${BUILD_ARCHS[@]}"; do
|
||||
BIN_INPUTS+=("$(bin_for_arch "$arch")")
|
||||
done
|
||||
/usr/bin/lipo -create "${BIN_INPUTS[@]}" -output "$APP_ROOT/Contents/MacOS/Moltbot"
|
||||
/usr/bin/lipo -create "${BIN_INPUTS[@]}" -output "$APP_ROOT/Contents/MacOS/OpenClaw"
|
||||
fi
|
||||
chmod +x "$APP_ROOT/Contents/MacOS/Moltbot"
|
||||
chmod +x "$APP_ROOT/Contents/MacOS/OpenClaw"
|
||||
# SwiftPM outputs ad-hoc signed binaries; strip the signature before install_name_tool to avoid warnings.
|
||||
/usr/bin/codesign --remove-signature "$APP_ROOT/Contents/MacOS/Moltbot" 2>/dev/null || true
|
||||
/usr/bin/codesign --remove-signature "$APP_ROOT/Contents/MacOS/OpenClaw" 2>/dev/null || true
|
||||
|
||||
SPARKLE_FRAMEWORK_PRIMARY="$(sparkle_framework_for_arch "$PRIMARY_ARCH")"
|
||||
if [ -d "$SPARKLE_FRAMEWORK_PRIMARY" ]; then
|
||||
@@ -201,11 +201,11 @@ else
|
||||
fi
|
||||
|
||||
echo "🖼 Copying app icon"
|
||||
cp "$ROOT_DIR/apps/macos/Sources/Moltbot/Resources/Moltbot.icns" "$APP_ROOT/Contents/Resources/Moltbot.icns"
|
||||
cp "$ROOT_DIR/apps/macos/Sources/OpenClaw/Resources/OpenClaw.icns" "$APP_ROOT/Contents/Resources/OpenClaw.icns"
|
||||
|
||||
echo "📦 Copying device model resources"
|
||||
rm -rf "$APP_ROOT/Contents/Resources/DeviceModels"
|
||||
cp -R "$ROOT_DIR/apps/macos/Sources/Moltbot/Resources/DeviceModels" "$APP_ROOT/Contents/Resources/DeviceModels"
|
||||
cp -R "$ROOT_DIR/apps/macos/Sources/OpenClaw/Resources/DeviceModels" "$APP_ROOT/Contents/Resources/DeviceModels"
|
||||
|
||||
echo "📦 Copying model catalog"
|
||||
MODEL_CATALOG_SRC="$ROOT_DIR/node_modules/@mariozechner/pi-ai/dist/models.generated.js"
|
||||
@@ -216,13 +216,13 @@ else
|
||||
echo "WARN: model catalog missing at $MODEL_CATALOG_SRC (continuing)" >&2
|
||||
fi
|
||||
|
||||
echo "📦 Copying MoltbotKit resources"
|
||||
MOLTBOTKIT_BUNDLE="$(build_path_for_arch "$PRIMARY_ARCH")/$BUILD_CONFIG/MoltbotKit_MoltbotKit.bundle"
|
||||
if [ -d "$MOLTBOTKIT_BUNDLE" ]; then
|
||||
rm -rf "$APP_ROOT/Contents/Resources/MoltbotKit_MoltbotKit.bundle"
|
||||
cp -R "$MOLTBOTKIT_BUNDLE" "$APP_ROOT/Contents/Resources/MoltbotKit_MoltbotKit.bundle"
|
||||
echo "📦 Copying OpenClawKit resources"
|
||||
OPENCLAWKIT_BUNDLE="$(build_path_for_arch "$PRIMARY_ARCH")/$BUILD_CONFIG/OpenClawKit_OpenClawKit.bundle"
|
||||
if [ -d "$OPENCLAWKIT_BUNDLE" ]; then
|
||||
rm -rf "$APP_ROOT/Contents/Resources/OpenClawKit_OpenClawKit.bundle"
|
||||
cp -R "$OPENCLAWKIT_BUNDLE" "$APP_ROOT/Contents/Resources/OpenClawKit_OpenClawKit.bundle"
|
||||
else
|
||||
echo "WARN: MoltbotKit resource bundle not found at $MOLTBOTKIT_BUNDLE (continuing)" >&2
|
||||
echo "WARN: OpenClawKit resource bundle not found at $OPENCLAWKIT_BUNDLE (continuing)" >&2
|
||||
fi
|
||||
|
||||
echo "📦 Copying Textual resources"
|
||||
@@ -252,8 +252,8 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "⏹ Stopping any running Moltbot"
|
||||
killall -q Moltbot 2>/dev/null || true
|
||||
echo "⏹ Stopping any running OpenClaw"
|
||||
killall -q OpenClaw 2>/dev/null || true
|
||||
|
||||
echo "🔏 Signing bundle (auto-selects signing identity if SIGN_IDENTITY is unset)"
|
||||
"$ROOT_DIR/scripts/codesign-mac-app.sh" "$APP_ROOT"
|
||||
|
||||
@@ -4,9 +4,9 @@ set -euo pipefail
|
||||
# Build the mac app bundle, then create a zip (Sparkle) + styled DMG (humans).
|
||||
#
|
||||
# Output:
|
||||
# - dist/Moltbot.app
|
||||
# - dist/Moltbot-<version>.zip
|
||||
# - dist/Moltbot-<version>.dmg
|
||||
# - dist/OpenClaw.app
|
||||
# - dist/OpenClaw-<version>.zip
|
||||
# - dist/OpenClaw-<version>.dmg
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
|
||||
@@ -15,16 +15,16 @@ export BUILD_ARCHS="${BUILD_ARCHS:-all}"
|
||||
|
||||
"$ROOT_DIR/scripts/package-mac-app.sh"
|
||||
|
||||
APP="$ROOT_DIR/dist/Moltbot.app"
|
||||
APP="$ROOT_DIR/dist/OpenClaw.app"
|
||||
if [[ ! -d "$APP" ]]; then
|
||||
echo "Error: missing app bundle at $APP" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$APP/Contents/Info.plist" 2>/dev/null || echo "0.0.0")
|
||||
ZIP="$ROOT_DIR/dist/Moltbot-$VERSION.zip"
|
||||
DMG="$ROOT_DIR/dist/Moltbot-$VERSION.dmg"
|
||||
NOTARY_ZIP="$ROOT_DIR/dist/Moltbot-$VERSION.notary.zip"
|
||||
ZIP="$ROOT_DIR/dist/OpenClaw-$VERSION.zip"
|
||||
DMG="$ROOT_DIR/dist/OpenClaw-$VERSION.dmg"
|
||||
NOTARY_ZIP="$ROOT_DIR/dist/OpenClaw-$VERSION.notary.zip"
|
||||
SKIP_NOTARIZE="${SKIP_NOTARIZE:-0}"
|
||||
NOTARIZE=1
|
||||
|
||||
|
||||
@@ -278,6 +278,7 @@ function main() {
|
||||
|
||||
try {
|
||||
const skip =
|
||||
process.env.OPENCLAW_SKIP_POSTINSTALL === "1" ||
|
||||
process.env.CLAWDBOT_SKIP_POSTINSTALL === "1" ||
|
||||
process.env.VITEST === "true" ||
|
||||
process.env.NODE_ENV === "test";
|
||||
|
||||
@@ -24,16 +24,16 @@ const outPaths = [
|
||||
"apps",
|
||||
"macos",
|
||||
"Sources",
|
||||
"MoltbotProtocol",
|
||||
"OpenClawProtocol",
|
||||
"GatewayModels.swift",
|
||||
),
|
||||
path.join(
|
||||
repoRoot,
|
||||
"apps",
|
||||
"shared",
|
||||
"MoltbotKit",
|
||||
"OpenClawKit",
|
||||
"Sources",
|
||||
"MoltbotProtocol",
|
||||
"OpenClawProtocol",
|
||||
"GatewayModels.swift",
|
||||
),
|
||||
];
|
||||
|
||||
@@ -14,8 +14,8 @@ async function writeJsonSchema() {
|
||||
|
||||
const rootSchema = {
|
||||
$schema: "http://json-schema.org/draft-07/schema#",
|
||||
$id: "https://moltbot.dev/protocol.schema.json",
|
||||
title: "Moltbot Gateway Protocol",
|
||||
$id: "https://openclaw.ai/protocol.schema.json",
|
||||
title: "OpenClaw Gateway Protocol",
|
||||
description: "Handshake, request/response, and event frames for the Gateway WebSocket.",
|
||||
oneOf: [
|
||||
{ $ref: "#/definitions/RequestFrame" },
|
||||
|
||||
@@ -12,7 +12,7 @@ const requiredPaths = [
|
||||
"dist/hooks/gmail.js",
|
||||
"dist/whatsapp/normalize.js",
|
||||
];
|
||||
const forbiddenPrefixes = ["dist/Moltbot.app/"];
|
||||
const forbiddenPrefixes = ["dist/OpenClaw.app/"];
|
||||
|
||||
type PackageJson = {
|
||||
name?: string;
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
# Reset Moltbot like Trimmy: kill running instances, rebuild, repackage, relaunch, verify.
|
||||
# Reset OpenClaw like Trimmy: kill running instances, rebuild, repackage, relaunch, verify.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
APP_BUNDLE="${CLAWDBOT_APP_BUNDLE:-}"
|
||||
APP_PROCESS_PATTERN="Moltbot.app/Contents/MacOS/Moltbot"
|
||||
DEBUG_PROCESS_PATTERN="${ROOT_DIR}/apps/macos/.build/debug/Moltbot"
|
||||
LOCAL_PROCESS_PATTERN="${ROOT_DIR}/apps/macos/.build-local/debug/Moltbot"
|
||||
RELEASE_PROCESS_PATTERN="${ROOT_DIR}/apps/macos/.build/release/Moltbot"
|
||||
LAUNCH_AGENT="${HOME}/Library/LaunchAgents/bot.molt.mac.plist"
|
||||
APP_BUNDLE="${OPENCLAW_APP_BUNDLE:-}"
|
||||
APP_PROCESS_PATTERN="OpenClaw.app/Contents/MacOS/OpenClaw"
|
||||
DEBUG_PROCESS_PATTERN="${ROOT_DIR}/apps/macos/.build/debug/OpenClaw"
|
||||
LOCAL_PROCESS_PATTERN="${ROOT_DIR}/apps/macos/.build-local/debug/OpenClaw"
|
||||
RELEASE_PROCESS_PATTERN="${ROOT_DIR}/apps/macos/.build/release/OpenClaw"
|
||||
LAUNCH_AGENT="${HOME}/Library/LaunchAgents/ai.openclaw.mac.plist"
|
||||
LOCK_KEY="$(printf '%s' "${ROOT_DIR}" | shasum -a 256 | cut -c1-8)"
|
||||
LOCK_DIR="${TMPDIR:-/tmp}/moltbot-restart-${LOCK_KEY}"
|
||||
LOCK_DIR="${TMPDIR:-/tmp}/openclaw-restart-${LOCK_KEY}"
|
||||
LOCK_PID_FILE="${LOCK_DIR}/pid"
|
||||
WAIT_FOR_LOCK=0
|
||||
LOG_PATH="${CLAWDBOT_RESTART_LOG:-/tmp/moltbot-restart.log}"
|
||||
LOG_PATH="${OPENCLAW_RESTART_LOG:-/tmp/openclaw-restart.log}"
|
||||
NO_SIGN=0
|
||||
SIGN=0
|
||||
AUTO_DETECT_SIGNING=1
|
||||
GATEWAY_WAIT_SECONDS="${CLAWDBOT_GATEWAY_WAIT_SECONDS:-0}"
|
||||
LAUNCHAGENT_DISABLE_MARKER="${HOME}/.clawdbot/disable-launchagent"
|
||||
GATEWAY_WAIT_SECONDS="${OPENCLAW_GATEWAY_WAIT_SECONDS:-0}"
|
||||
LAUNCHAGENT_DISABLE_MARKER="${HOME}/.openclaw/disable-launchagent"
|
||||
ATTACH_ONLY=1
|
||||
|
||||
log() { printf '%s\n' "$*"; }
|
||||
@@ -93,14 +93,14 @@ for arg in "$@"; do
|
||||
log " --no-attach-only Launch app without attach-only override"
|
||||
log ""
|
||||
log "Env:"
|
||||
log " CLAWDBOT_GATEWAY_WAIT_SECONDS=0 Wait time before gateway port check (unsigned only)"
|
||||
log " OPENCLAW_GATEWAY_WAIT_SECONDS=0 Wait time before gateway port check (unsigned only)"
|
||||
log ""
|
||||
log "Unsigned recovery:"
|
||||
log " node moltbot.mjs daemon install --force --runtime node"
|
||||
log " node moltbot.mjs daemon restart"
|
||||
log " node openclaw.mjs daemon install --force --runtime node"
|
||||
log " node openclaw.mjs daemon restart"
|
||||
log ""
|
||||
log "Reset unsigned overrides:"
|
||||
log " rm ~/.clawdbot/disable-launchagent"
|
||||
log " rm ~/.openclaw/disable-launchagent"
|
||||
log ""
|
||||
log "Default behavior: Auto-detect signing keys, fallback to --no-sign if none found"
|
||||
exit 0
|
||||
@@ -126,18 +126,18 @@ fi
|
||||
|
||||
acquire_lock
|
||||
|
||||
kill_all_moltbot() {
|
||||
kill_all_openclaw() {
|
||||
for _ in {1..10}; do
|
||||
pkill -f "${APP_PROCESS_PATTERN}" 2>/dev/null || true
|
||||
pkill -f "${DEBUG_PROCESS_PATTERN}" 2>/dev/null || true
|
||||
pkill -f "${LOCAL_PROCESS_PATTERN}" 2>/dev/null || true
|
||||
pkill -f "${RELEASE_PROCESS_PATTERN}" 2>/dev/null || true
|
||||
pkill -x "Moltbot" 2>/dev/null || true
|
||||
pkill -x "OpenClaw" 2>/dev/null || true
|
||||
if ! pgrep -f "${APP_PROCESS_PATTERN}" >/dev/null 2>&1 \
|
||||
&& ! pgrep -f "${DEBUG_PROCESS_PATTERN}" >/dev/null 2>&1 \
|
||||
&& ! pgrep -f "${LOCAL_PROCESS_PATTERN}" >/dev/null 2>&1 \
|
||||
&& ! pgrep -f "${RELEASE_PROCESS_PATTERN}" >/dev/null 2>&1 \
|
||||
&& ! pgrep -x "Moltbot" >/dev/null 2>&1; then
|
||||
&& ! pgrep -x "OpenClaw" >/dev/null 2>&1; then
|
||||
return 0
|
||||
fi
|
||||
sleep 0.3
|
||||
@@ -145,12 +145,12 @@ kill_all_moltbot() {
|
||||
}
|
||||
|
||||
stop_launch_agent() {
|
||||
launchctl bootout gui/"$UID"/bot.molt.mac 2>/dev/null || true
|
||||
launchctl bootout gui/"$UID"/ai.openclaw.mac 2>/dev/null || true
|
||||
}
|
||||
|
||||
# 1) Kill all running instances first.
|
||||
log "==> Killing existing Moltbot instances"
|
||||
kill_all_moltbot
|
||||
log "==> Killing existing OpenClaw instances"
|
||||
kill_all_openclaw
|
||||
stop_launch_agent
|
||||
|
||||
# Bundle Gateway-hosted Canvas A2UI assets.
|
||||
@@ -158,7 +158,7 @@ run_step "bundle canvas a2ui" bash -lc "cd '${ROOT_DIR}' && pnpm canvas:a2ui:bun
|
||||
|
||||
# 2) Rebuild into the same path the packager consumes (.build).
|
||||
run_step "clean build cache" bash -lc "cd '${ROOT_DIR}/apps/macos' && rm -rf .build .build-swift .swiftpm 2>/dev/null || true"
|
||||
run_step "swift build" bash -lc "cd '${ROOT_DIR}/apps/macos' && swift build -q --product Moltbot"
|
||||
run_step "swift build" bash -lc "cd '${ROOT_DIR}/apps/macos' && swift build -q --product OpenClaw"
|
||||
|
||||
if [ "$AUTO_DETECT_SIGNING" -eq 1 ]; then
|
||||
if check_signing_keys; then
|
||||
@@ -173,7 +173,7 @@ fi
|
||||
if [ "$NO_SIGN" -eq 1 ]; then
|
||||
export ALLOW_ADHOC_SIGNING=1
|
||||
export SIGN_IDENTITY="-"
|
||||
mkdir -p "${HOME}/.clawdbot"
|
||||
mkdir -p "${HOME}/.openclaw"
|
||||
run_step "disable launchagent writes" /usr/bin/touch "${LAUNCHAGENT_DISABLE_MARKER}"
|
||||
elif [ "$SIGN" -eq 1 ]; then
|
||||
if ! check_signing_keys; then
|
||||
@@ -191,20 +191,20 @@ choose_app_bundle() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -d "/Applications/Moltbot.app" ]]; then
|
||||
APP_BUNDLE="/Applications/Moltbot.app"
|
||||
if [[ -d "/Applications/OpenClaw.app" ]]; then
|
||||
APP_BUNDLE="/Applications/OpenClaw.app"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -d "${ROOT_DIR}/dist/Moltbot.app" ]]; then
|
||||
APP_BUNDLE="${ROOT_DIR}/dist/Moltbot.app"
|
||||
if [[ -d "${ROOT_DIR}/dist/OpenClaw.app" ]]; then
|
||||
APP_BUNDLE="${ROOT_DIR}/dist/OpenClaw.app"
|
||||
if [[ ! -d "${APP_BUNDLE}/Contents/Frameworks/Sparkle.framework" ]]; then
|
||||
fail "dist/Moltbot.app missing Sparkle after packaging"
|
||||
fail "dist/OpenClaw.app missing Sparkle after packaging"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
fail "App bundle not found. Set CLAWDBOT_APP_BUNDLE to your installed Moltbot.app"
|
||||
fail "App bundle not found. Set OPENCLAW_APP_BUNDLE to your installed OpenClaw.app"
|
||||
}
|
||||
|
||||
choose_app_bundle
|
||||
@@ -217,8 +217,8 @@ fi
|
||||
# When unsigned, ensure the gateway LaunchAgent targets the repo CLI (before the app launches).
|
||||
# This reduces noisy "could not connect" errors during app startup.
|
||||
if [ "$NO_SIGN" -eq 1 ] && [ "$ATTACH_ONLY" -ne 1 ]; then
|
||||
run_step "install gateway launch agent (unsigned)" bash -lc "cd '${ROOT_DIR}' && node moltbot.mjs daemon install --force --runtime node"
|
||||
run_step "restart gateway daemon (unsigned)" bash -lc "cd '${ROOT_DIR}' && node moltbot.mjs daemon restart"
|
||||
run_step "install gateway launch agent (unsigned)" bash -lc "cd '${ROOT_DIR}' && node openclaw.mjs daemon install --force --runtime node"
|
||||
run_step "restart gateway daemon (unsigned)" bash -lc "cd '${ROOT_DIR}' && node openclaw.mjs daemon restart"
|
||||
if [[ "${GATEWAY_WAIT_SECONDS}" -gt 0 ]]; then
|
||||
run_step "wait for gateway (unsigned)" sleep "${GATEWAY_WAIT_SECONDS}"
|
||||
fi
|
||||
@@ -227,7 +227,7 @@ if [ "$NO_SIGN" -eq 1 ] && [ "$ATTACH_ONLY" -ne 1 ]; then
|
||||
const fs = require("node:fs");
|
||||
const path = require("node:path");
|
||||
try {
|
||||
const raw = fs.readFileSync(path.join(process.env.HOME, ".clawdbot", "moltbot.json"), "utf8");
|
||||
const raw = fs.readFileSync(path.join(process.env.HOME, ".openclaw", "openclaw.json"), "utf8");
|
||||
const cfg = JSON.parse(raw);
|
||||
const port = cfg && cfg.gateway && typeof cfg.gateway.port === "number" ? cfg.gateway.port : 18789;
|
||||
process.stdout.write(String(port));
|
||||
@@ -259,7 +259,7 @@ run_step "launch app" env -i \
|
||||
# 5) Verify the app is alive.
|
||||
sleep 1.5
|
||||
if pgrep -f "${APP_PROCESS_PATTERN}" >/dev/null 2>&1; then
|
||||
log "OK: Moltbot is running."
|
||||
log "OK: OpenClaw is running."
|
||||
else
|
||||
fail "App exited immediately. Check ${LOG_PATH} or Console.app (User Reports)."
|
||||
fi
|
||||
|
||||
@@ -7,7 +7,7 @@ import process from "node:process";
|
||||
const args = process.argv.slice(2);
|
||||
const env = { ...process.env };
|
||||
const cwd = process.cwd();
|
||||
const compiler = env.CLAWDBOT_TS_COMPILER === "tsc" ? "tsc" : "tsgo";
|
||||
const compiler = env.OPENCLAW_TS_COMPILER === "tsc" ? "tsc" : "tsgo";
|
||||
const projectArgs = ["--project", "tsconfig.json"];
|
||||
|
||||
const distRoot = path.join(cwd, "dist");
|
||||
@@ -65,7 +65,7 @@ const findLatestMtime = (dirPath, shouldSkip) => {
|
||||
};
|
||||
|
||||
const shouldBuild = () => {
|
||||
if (env.CLAWDBOT_FORCE_BUILD === "1") return true;
|
||||
if (env.OPENCLAW_FORCE_BUILD === "1") return true;
|
||||
const stampMtime = statMtime(buildStampPath);
|
||||
if (stampMtime == null) return true;
|
||||
if (statMtime(distEntry) == null) return true;
|
||||
@@ -81,12 +81,12 @@ const shouldBuild = () => {
|
||||
};
|
||||
|
||||
const logRunner = (message) => {
|
||||
if (env.CLAWDBOT_RUNNER_LOG === "0") return;
|
||||
process.stderr.write(`[moltbot] ${message}\n`);
|
||||
if (env.OPENCLAW_RUNNER_LOG === "0") return;
|
||||
process.stderr.write(`[openclaw] ${message}\n`);
|
||||
};
|
||||
|
||||
const runNode = () => {
|
||||
const nodeProcess = spawn(process.execPath, ["moltbot.mjs", ...args], {
|
||||
const nodeProcess = spawn(process.execPath, ["openclaw.mjs", ...args], {
|
||||
cwd,
|
||||
env,
|
||||
stdio: "inherit",
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
set -euo pipefail
|
||||
|
||||
export DISPLAY=:1
|
||||
export HOME=/tmp/moltbot-home
|
||||
export HOME=/tmp/openclaw-home
|
||||
export XDG_CONFIG_HOME="${HOME}/.config"
|
||||
export XDG_CACHE_HOME="${HOME}/.cache"
|
||||
|
||||
CDP_PORT="${CLAWDBOT_BROWSER_CDP_PORT:-9222}"
|
||||
VNC_PORT="${CLAWDBOT_BROWSER_VNC_PORT:-5900}"
|
||||
NOVNC_PORT="${CLAWDBOT_BROWSER_NOVNC_PORT:-6080}"
|
||||
ENABLE_NOVNC="${CLAWDBOT_BROWSER_ENABLE_NOVNC:-1}"
|
||||
HEADLESS="${CLAWDBOT_BROWSER_HEADLESS:-0}"
|
||||
CDP_PORT="${OPENCLAW_BROWSER_CDP_PORT:-${CLAWDBOT_BROWSER_CDP_PORT:-9222}}"
|
||||
VNC_PORT="${OPENCLAW_BROWSER_VNC_PORT:-${CLAWDBOT_BROWSER_VNC_PORT:-5900}}"
|
||||
NOVNC_PORT="${OPENCLAW_BROWSER_NOVNC_PORT:-${CLAWDBOT_BROWSER_NOVNC_PORT:-6080}}"
|
||||
ENABLE_NOVNC="${OPENCLAW_BROWSER_ENABLE_NOVNC:-${CLAWDBOT_BROWSER_ENABLE_NOVNC:-1}}"
|
||||
HEADLESS="${OPENCLAW_BROWSER_HEADLESS:-${CLAWDBOT_BROWSER_HEADLESS:-0}}"
|
||||
|
||||
mkdir -p "${HOME}" "${HOME}/.chrome" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
IMAGE_NAME="moltbot-sandbox-browser:bookworm-slim"
|
||||
IMAGE_NAME="openclaw-sandbox-browser:bookworm-slim"
|
||||
|
||||
docker build -t "${IMAGE_NAME}" -f Dockerfile.sandbox-browser .
|
||||
echo "Built ${IMAGE_NAME}"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
BASE_IMAGE="${BASE_IMAGE:-moltbot-sandbox:bookworm-slim}"
|
||||
TARGET_IMAGE="${TARGET_IMAGE:-moltbot-sandbox-common:bookworm-slim}"
|
||||
BASE_IMAGE="${BASE_IMAGE:-openclaw-sandbox:bookworm-slim}"
|
||||
TARGET_IMAGE="${TARGET_IMAGE:-openclaw-sandbox-common:bookworm-slim}"
|
||||
PACKAGES="${PACKAGES:-curl wget jq coreutils grep nodejs npm python3 git ca-certificates golang-go rustc cargo unzip pkg-config libasound2-dev build-essential file}"
|
||||
INSTALL_PNPM="${INSTALL_PNPM:-1}"
|
||||
INSTALL_BUN="${INSTALL_BUN:-1}"
|
||||
@@ -61,5 +61,5 @@ cat <<NOTE
|
||||
Built ${TARGET_IMAGE}.
|
||||
To use it, set agents.defaults.sandbox.docker.image to "${TARGET_IMAGE}" and restart.
|
||||
If you want a clean re-create, remove old sandbox containers:
|
||||
docker rm -f \$(docker ps -aq --filter label=moltbot.sandbox=1)
|
||||
docker rm -f \$(docker ps -aq --filter label=openclaw.sandbox=1)
|
||||
NOTE
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
IMAGE_NAME="moltbot-sandbox:bookworm-slim"
|
||||
IMAGE_NAME="openclaw-sandbox:bookworm-slim"
|
||||
|
||||
docker build -t "${IMAGE_NAME}" -f Dockerfile.sandbox .
|
||||
echo "Built ${IMAGE_NAME}"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# Setup Moltbot Auth Management System
|
||||
# Setup OpenClaw Auth Management System
|
||||
# Run this once to set up:
|
||||
# 1. Long-lived Claude Code token
|
||||
# 2. Auth monitoring with notifications
|
||||
@@ -9,7 +9,7 @@ set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
echo "=== Moltbot Auth System Setup ==="
|
||||
echo "=== OpenClaw Auth System Setup ==="
|
||||
echo ""
|
||||
|
||||
# Step 1: Check current auth status
|
||||
@@ -49,19 +49,19 @@ echo ""
|
||||
# Check for ntfy
|
||||
echo " ntfy.sh: Free push notifications to your phone"
|
||||
echo " 1. Install ntfy app on your phone"
|
||||
echo " 2. Subscribe to a topic (e.g., 'moltbot-alerts')"
|
||||
echo " 2. Subscribe to a topic (e.g., 'openclaw-alerts')"
|
||||
echo ""
|
||||
echo "Enter ntfy.sh topic (or leave blank to skip):"
|
||||
read -r NTFY_TOPIC
|
||||
|
||||
# Phone notification
|
||||
echo ""
|
||||
echo " Moltbot message: Send warning via Moltbot itself"
|
||||
echo " OpenClaw message: Send warning via OpenClaw itself"
|
||||
echo "Enter your phone number for alerts (or leave blank to skip):"
|
||||
read -r PHONE_NUMBER
|
||||
|
||||
# Update service file
|
||||
SERVICE_FILE="$SCRIPT_DIR/systemd/moltbot-auth-monitor.service"
|
||||
SERVICE_FILE="$SCRIPT_DIR/systemd/openclaw-auth-monitor.service"
|
||||
if [ -n "$NTFY_TOPIC" ]; then
|
||||
sed -i "s|# Environment=NOTIFY_NTFY=.*|Environment=NOTIFY_NTFY=$NTFY_TOPIC|" "$SERVICE_FILE"
|
||||
fi
|
||||
@@ -73,10 +73,10 @@ fi
|
||||
echo ""
|
||||
echo "Installing systemd timer..."
|
||||
mkdir -p ~/.config/systemd/user
|
||||
cp "$SCRIPT_DIR/systemd/moltbot-auth-monitor.service" ~/.config/systemd/user/
|
||||
cp "$SCRIPT_DIR/systemd/moltbot-auth-monitor.timer" ~/.config/systemd/user/
|
||||
cp "$SCRIPT_DIR/systemd/openclaw-auth-monitor.service" ~/.config/systemd/user/
|
||||
cp "$SCRIPT_DIR/systemd/openclaw-auth-monitor.timer" ~/.config/systemd/user/
|
||||
systemctl --user daemon-reload
|
||||
systemctl --user enable --now moltbot-auth-monitor.timer
|
||||
systemctl --user enable --now openclaw-auth-monitor.timer
|
||||
|
||||
echo "Auth monitor installed and running."
|
||||
echo ""
|
||||
@@ -110,7 +110,7 @@ echo ""
|
||||
echo "What's configured:"
|
||||
echo " - Auth status: $SCRIPT_DIR/claude-auth-status.sh"
|
||||
echo " - Mobile re-auth: $SCRIPT_DIR/mobile-reauth.sh"
|
||||
echo " - Auth monitor: systemctl --user status moltbot-auth-monitor.timer"
|
||||
echo " - Auth monitor: systemctl --user status openclaw-auth-monitor.timer"
|
||||
echo ""
|
||||
echo "Quick commands:"
|
||||
echo " Check auth: $SCRIPT_DIR/claude-auth-status.sh"
|
||||
|
||||
@@ -26,7 +26,7 @@ function ensureChangelogEntry(changelogPath: string, version: string): boolean {
|
||||
if (!existsSync(changelogPath)) return false;
|
||||
const content = readFileSync(changelogPath, "utf8");
|
||||
if (content.includes(`## ${version}`)) return false;
|
||||
const entry = `## ${version}\n\n### Changes\n- Version alignment with core Moltbot release numbers.\n\n`;
|
||||
const entry = `## ${version}\n\n### Changes\n- Version alignment with core OpenClaw release numbers.\n\n`;
|
||||
if (content.startsWith("# Changelog\n\n")) {
|
||||
const next = content.replace("# Changelog\n\n", `# Changelog\n\n${entry}`);
|
||||
writeFileSync(changelogPath, next);
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
[Unit]
|
||||
Description=Moltbot Auth Expiry Monitor
|
||||
Description=OpenClaw Auth Expiry Monitor
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/home/admin/moltbot/scripts/auth-monitor.sh
|
||||
ExecStart=/home/admin/openclaw/scripts/auth-monitor.sh
|
||||
# Configure notification channels via environment
|
||||
Environment=WARN_HOURS=2
|
||||
# Environment=NOTIFY_PHONE=+1234567890
|
||||
# Environment=NOTIFY_NTFY=moltbot-alerts
|
||||
# Environment=NOTIFY_NTFY=openclaw-alerts
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
@@ -1,5 +1,5 @@
|
||||
[Unit]
|
||||
Description=Check Moltbot auth expiry every 30 minutes
|
||||
Description=Check OpenClaw auth expiry every 30 minutes
|
||||
|
||||
[Timer]
|
||||
OnBootSec=5min
|
||||
@@ -1,30 +1,30 @@
|
||||
#!/data/data/com.termux/files/usr/bin/bash
|
||||
# Moltbot Auth Widget for Termux
|
||||
# OpenClaw Auth Widget for Termux
|
||||
# Place in ~/.shortcuts/ for Termux:Widget
|
||||
#
|
||||
# This widget checks auth status and helps with re-auth if needed.
|
||||
# It's designed for quick one-tap checking from phone home screen.
|
||||
|
||||
# Server hostname (via Tailscale or SSH config)
|
||||
SERVER="${CLAWDBOT_SERVER:-l36}"
|
||||
SERVER="${OPENCLAW_SERVER:-${CLAWDBOT_SERVER:-l36}}"
|
||||
|
||||
# Check auth status
|
||||
termux-toast "Checking Moltbot auth..."
|
||||
termux-toast "Checking OpenClaw auth..."
|
||||
|
||||
STATUS=$(ssh "$SERVER" '$HOME/moltbot/scripts/claude-auth-status.sh simple' 2>&1)
|
||||
STATUS=$(ssh "$SERVER" '$HOME/openclaw/scripts/claude-auth-status.sh simple' 2>&1)
|
||||
EXIT_CODE=$?
|
||||
|
||||
case "$STATUS" in
|
||||
OK)
|
||||
# Get remaining time
|
||||
DETAILS=$(ssh "$SERVER" '$HOME/moltbot/scripts/claude-auth-status.sh json' 2>&1)
|
||||
DETAILS=$(ssh "$SERVER" '$HOME/openclaw/scripts/claude-auth-status.sh json' 2>&1)
|
||||
HOURS=$(echo "$DETAILS" | jq -r '.claude_code.status' | grep -oP '\d+(?=h)' || echo "?")
|
||||
|
||||
termux-vibrate -d 50
|
||||
termux-toast "Auth OK (${HOURS}h left)"
|
||||
;;
|
||||
|
||||
CLAUDE_EXPIRING|CLAWDBOT_EXPIRING)
|
||||
CLAUDE_EXPIRING|OPENCLAW_EXPIRING|CLAWDBOT_EXPIRING)
|
||||
termux-vibrate -d 100
|
||||
|
||||
# Ask if user wants to re-auth now
|
||||
@@ -43,7 +43,7 @@ case "$STATUS" in
|
||||
|
||||
# Open terminal to server
|
||||
am start -n com.termux/com.termux.app.TermuxActivity -a android.intent.action.MAIN
|
||||
termux-toast "Run: ssh $SERVER '$HOME/moltbot/scripts/mobile-reauth.sh'"
|
||||
termux-toast "Run: ssh $SERVER '$HOME/openclaw/scripts/mobile-reauth.sh'"
|
||||
;;
|
||||
*)
|
||||
termux-toast "Reminder: Auth expires soon"
|
||||
@@ -51,7 +51,7 @@ case "$STATUS" in
|
||||
esac
|
||||
;;
|
||||
|
||||
CLAUDE_EXPIRED|CLAWDBOT_EXPIRED)
|
||||
CLAUDE_EXPIRED|OPENCLAW_EXPIRED|CLAWDBOT_EXPIRED)
|
||||
termux-vibrate -d 300
|
||||
|
||||
CHOICE=$(termux-dialog radio -t "Auth Expired!" -v "Re-auth now,Dismiss")
|
||||
@@ -66,10 +66,10 @@ case "$STATUS" in
|
||||
2. Return here and tap OK to SSH"
|
||||
|
||||
am start -n com.termux/com.termux.app.TermuxActivity -a android.intent.action.MAIN
|
||||
termux-toast "Run: ssh $SERVER '$HOME/moltbot/scripts/mobile-reauth.sh'"
|
||||
termux-toast "Run: ssh $SERVER '$HOME/openclaw/scripts/mobile-reauth.sh'"
|
||||
;;
|
||||
*)
|
||||
termux-toast "Warning: Moltbot won't work until re-auth"
|
||||
termux-toast "Warning: OpenClaw won't work until re-auth"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
# One-tap: shows status toast
|
||||
# If expired: directly opens auth URL
|
||||
|
||||
SERVER="${CLAWDBOT_SERVER:-l36}"
|
||||
SERVER="${OPENCLAW_SERVER:-${CLAWDBOT_SERVER:-l36}}"
|
||||
|
||||
STATUS=$(ssh -o ConnectTimeout=5 "$SERVER" '$HOME/moltbot/scripts/claude-auth-status.sh simple' 2>&1)
|
||||
STATUS=$(ssh -o ConnectTimeout=5 "$SERVER" '$HOME/openclaw/scripts/claude-auth-status.sh simple' 2>&1)
|
||||
|
||||
case "$STATUS" in
|
||||
OK)
|
||||
@@ -22,7 +22,7 @@ case "$STATUS" in
|
||||
termux-toast "Auth expired - opening console..."
|
||||
termux-open-url "https://console.anthropic.com/settings/api-keys"
|
||||
sleep 2
|
||||
termux-notification -t "Moltbot Re-Auth" -c "After getting key, run: ssh $SERVER '~/moltbot/scripts/mobile-reauth.sh'" --id clawd-auth
|
||||
termux-notification -t "OpenClaw Re-Auth" -c "After getting key, run: ssh $SERVER '~/openclaw/scripts/mobile-reauth.sh'" --id openclaw-auth
|
||||
;;
|
||||
*)
|
||||
termux-toast "Connection error"
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#!/data/data/com.termux/files/usr/bin/bash
|
||||
# Moltbot OAuth Sync Widget
|
||||
# Syncs Claude Code tokens to Moltbot on l36 server
|
||||
# OpenClaw OAuth Sync Widget
|
||||
# Syncs Claude Code tokens to OpenClaw on l36 server
|
||||
# Place in ~/.shortcuts/ on phone for Termux:Widget
|
||||
|
||||
termux-toast "Syncing Moltbot auth..."
|
||||
termux-toast "Syncing OpenClaw auth..."
|
||||
|
||||
# Run sync on l36 server
|
||||
RESULT=$(ssh l36 '/home/admin/moltbot/scripts/sync-claude-code-auth.sh' 2>&1)
|
||||
SERVER="${OPENCLAW_SERVER:-${CLAWDBOT_SERVER:-l36}}"
|
||||
RESULT=$(ssh "$SERVER" '/home/admin/openclaw/scripts/sync-claude-code-auth.sh' 2>&1)
|
||||
EXIT_CODE=$?
|
||||
|
||||
if [ $EXIT_CODE -eq 0 ]; then
|
||||
@@ -14,10 +15,10 @@ if [ $EXIT_CODE -eq 0 ]; then
|
||||
EXPIRY=$(echo "$RESULT" | grep "Token expires:" | cut -d: -f2-)
|
||||
|
||||
termux-vibrate -d 100
|
||||
termux-toast "Moltbot synced! Expires:${EXPIRY}"
|
||||
termux-toast "OpenClaw synced! Expires:${EXPIRY}"
|
||||
|
||||
# Optional: restart moltbot service
|
||||
ssh l36 'systemctl --user restart moltbot' 2>/dev/null
|
||||
# Optional: restart openclaw service
|
||||
ssh "$SERVER" 'systemctl --user restart openclaw' 2>/dev/null
|
||||
else
|
||||
termux-vibrate -d 300
|
||||
termux-toast "Sync failed: ${RESULT}"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
IMAGE_NAME="${CLAWDBOT_CLEANUP_SMOKE_IMAGE:-moltbot-cleanup-smoke:local}"
|
||||
IMAGE_NAME="${OPENCLAW_CLEANUP_SMOKE_IMAGE:-${CLAWDBOT_CLEANUP_SMOKE_IMAGE:-openclaw-cleanup-smoke:local}}"
|
||||
|
||||
echo "==> Build image: $IMAGE_NAME"
|
||||
docker build \
|
||||
|
||||
@@ -27,13 +27,13 @@ function killGatewayListeners(port: number): PortProcess[] {
|
||||
|
||||
function runTests() {
|
||||
const isolatedLock =
|
||||
process.env.CLAWDBOT_GATEWAY_LOCK ??
|
||||
path.join(os.tmpdir(), `moltbot-gateway.lock.test.${Date.now()}`);
|
||||
process.env.OPENCLAW_GATEWAY_LOCK ??
|
||||
path.join(os.tmpdir(), `openclaw-gateway.lock.test.${Date.now()}`);
|
||||
const result = spawnSync("pnpm", ["vitest", "run"], {
|
||||
stdio: "inherit",
|
||||
env: {
|
||||
...process.env,
|
||||
CLAWDBOT_GATEWAY_LOCK: isolatedLock,
|
||||
OPENCLAW_GATEWAY_LOCK: isolatedLock,
|
||||
},
|
||||
});
|
||||
if (result.error) {
|
||||
@@ -44,10 +44,7 @@ function runTests() {
|
||||
}
|
||||
|
||||
function main() {
|
||||
const port = Number.parseInt(
|
||||
process.env.CLAWDBOT_GATEWAY_PORT ?? `${DEFAULT_PORT}`,
|
||||
10,
|
||||
);
|
||||
const port = Number.parseInt(process.env.OPENCLAW_GATEWAY_PORT ?? `${DEFAULT_PORT}`, 10);
|
||||
|
||||
console.log(`🧹 test:force - clearing gateway on port ${port}`);
|
||||
const killed = killGatewayListeners(port);
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
SMOKE_IMAGE="${CLAWDBOT_INSTALL_SMOKE_IMAGE:-moltbot-install-smoke:local}"
|
||||
NONROOT_IMAGE="${CLAWDBOT_INSTALL_NONROOT_IMAGE:-moltbot-install-nonroot:local}"
|
||||
INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://molt.bot/install.sh}"
|
||||
CLI_INSTALL_URL="${CLAWDBOT_INSTALL_CLI_URL:-https://molt.bot/install-cli.sh}"
|
||||
SKIP_NONROOT="${CLAWDBOT_INSTALL_SMOKE_SKIP_NONROOT:-0}"
|
||||
SMOKE_IMAGE="${OPENCLAW_INSTALL_SMOKE_IMAGE:-${CLAWDBOT_INSTALL_SMOKE_IMAGE:-openclaw-install-smoke:local}}"
|
||||
NONROOT_IMAGE="${OPENCLAW_INSTALL_NONROOT_IMAGE:-${CLAWDBOT_INSTALL_NONROOT_IMAGE:-openclaw-install-nonroot:local}}"
|
||||
INSTALL_URL="${OPENCLAW_INSTALL_URL:-${CLAWDBOT_INSTALL_URL:-https://openclaw.bot/install.sh}}"
|
||||
CLI_INSTALL_URL="${OPENCLAW_INSTALL_CLI_URL:-${CLAWDBOT_INSTALL_CLI_URL:-https://openclaw.bot/install-cli.sh}}"
|
||||
SKIP_NONROOT="${OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT:-${CLAWDBOT_INSTALL_SMOKE_SKIP_NONROOT:-0}}"
|
||||
LATEST_DIR="$(mktemp -d)"
|
||||
LATEST_FILE="${LATEST_DIR}/latest"
|
||||
|
||||
@@ -19,11 +19,11 @@ docker build \
|
||||
echo "==> Run installer smoke test (root): $INSTALL_URL"
|
||||
docker run --rm -t \
|
||||
-v "${LATEST_DIR}:/out" \
|
||||
-e CLAWDBOT_INSTALL_URL="$INSTALL_URL" \
|
||||
-e CLAWDBOT_INSTALL_LATEST_OUT="/out/latest" \
|
||||
-e CLAWDBOT_INSTALL_SMOKE_PREVIOUS="${CLAWDBOT_INSTALL_SMOKE_PREVIOUS:-}" \
|
||||
-e CLAWDBOT_INSTALL_SMOKE_SKIP_PREVIOUS="${CLAWDBOT_INSTALL_SMOKE_SKIP_PREVIOUS:-0}" \
|
||||
-e CLAWDBOT_NO_ONBOARD=1 \
|
||||
-e OPENCLAW_INSTALL_URL="$INSTALL_URL" \
|
||||
-e OPENCLAW_INSTALL_LATEST_OUT="/out/latest" \
|
||||
-e OPENCLAW_INSTALL_SMOKE_PREVIOUS="${OPENCLAW_INSTALL_SMOKE_PREVIOUS:-${CLAWDBOT_INSTALL_SMOKE_PREVIOUS:-}}" \
|
||||
-e OPENCLAW_INSTALL_SMOKE_SKIP_PREVIOUS="${OPENCLAW_INSTALL_SMOKE_SKIP_PREVIOUS:-${CLAWDBOT_INSTALL_SMOKE_SKIP_PREVIOUS:-0}}" \
|
||||
-e OPENCLAW_NO_ONBOARD=1 \
|
||||
-e DEBIAN_FRONTEND=noninteractive \
|
||||
"$SMOKE_IMAGE"
|
||||
|
||||
@@ -33,7 +33,7 @@ if [[ -f "$LATEST_FILE" ]]; then
|
||||
fi
|
||||
|
||||
if [[ "$SKIP_NONROOT" == "1" ]]; then
|
||||
echo "==> Skip non-root installer smoke (CLAWDBOT_INSTALL_SMOKE_SKIP_NONROOT=1)"
|
||||
echo "==> Skip non-root installer smoke (OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1)"
|
||||
else
|
||||
echo "==> Build non-root image: $NONROOT_IMAGE"
|
||||
docker build \
|
||||
@@ -43,15 +43,15 @@ else
|
||||
|
||||
echo "==> Run installer non-root test: $INSTALL_URL"
|
||||
docker run --rm -t \
|
||||
-e CLAWDBOT_INSTALL_URL="$INSTALL_URL" \
|
||||
-e CLAWDBOT_INSTALL_EXPECT_VERSION="$LATEST_VERSION" \
|
||||
-e CLAWDBOT_NO_ONBOARD=1 \
|
||||
-e OPENCLAW_INSTALL_URL="$INSTALL_URL" \
|
||||
-e OPENCLAW_INSTALL_EXPECT_VERSION="$LATEST_VERSION" \
|
||||
-e OPENCLAW_NO_ONBOARD=1 \
|
||||
-e DEBIAN_FRONTEND=noninteractive \
|
||||
"$NONROOT_IMAGE"
|
||||
fi
|
||||
|
||||
if [[ "${CLAWDBOT_INSTALL_SMOKE_SKIP_CLI:-0}" == "1" ]]; then
|
||||
echo "==> Skip CLI installer smoke (CLAWDBOT_INSTALL_SMOKE_SKIP_CLI=1)"
|
||||
if [[ "${OPENCLAW_INSTALL_SMOKE_SKIP_CLI:-${CLAWDBOT_INSTALL_SMOKE_SKIP_CLI:-0}}" == "1" ]]; then
|
||||
echo "==> Skip CLI installer smoke (OPENCLAW_INSTALL_SMOKE_SKIP_CLI=1)"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -63,8 +63,8 @@ fi
|
||||
echo "==> Run CLI installer non-root test (same image)"
|
||||
docker run --rm -t \
|
||||
--entrypoint /bin/bash \
|
||||
-e CLAWDBOT_INSTALL_URL="$INSTALL_URL" \
|
||||
-e CLAWDBOT_INSTALL_CLI_URL="$CLI_INSTALL_URL" \
|
||||
-e CLAWDBOT_NO_ONBOARD=1 \
|
||||
-e OPENCLAW_INSTALL_URL="$INSTALL_URL" \
|
||||
-e OPENCLAW_INSTALL_CLI_URL="$CLI_INSTALL_URL" \
|
||||
-e OPENCLAW_NO_ONBOARD=1 \
|
||||
-e DEBIAN_FRONTEND=noninteractive \
|
||||
"$NONROOT_IMAGE" -lc "curl -fsSL \"$CLI_INSTALL_URL\" | bash -s -- --set-npm-prefix --no-onboard"
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
IMAGE_NAME="${CLAWDBOT_INSTALL_E2E_IMAGE:-moltbot-install-e2e:local}"
|
||||
INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://molt.bot/install.sh}"
|
||||
IMAGE_NAME="${OPENCLAW_INSTALL_E2E_IMAGE:-${CLAWDBOT_INSTALL_E2E_IMAGE:-openclaw-install-e2e:local}}"
|
||||
INSTALL_URL="${OPENCLAW_INSTALL_URL:-${CLAWDBOT_INSTALL_URL:-https://openclaw.bot/install.sh}}"
|
||||
|
||||
OPENAI_API_KEY="${OPENAI_API_KEY:-}"
|
||||
ANTHROPIC_API_KEY="${ANTHROPIC_API_KEY:-}"
|
||||
ANTHROPIC_API_TOKEN="${ANTHROPIC_API_TOKEN:-}"
|
||||
CLAWDBOT_E2E_MODELS="${CLAWDBOT_E2E_MODELS:-}"
|
||||
OPENCLAW_E2E_MODELS="${OPENCLAW_E2E_MODELS:-${CLAWDBOT_E2E_MODELS:-}}"
|
||||
|
||||
echo "==> Build image: $IMAGE_NAME"
|
||||
docker build \
|
||||
@@ -18,11 +18,11 @@ docker build \
|
||||
|
||||
echo "==> Run E2E installer test"
|
||||
docker run --rm \
|
||||
-e CLAWDBOT_INSTALL_URL="$INSTALL_URL" \
|
||||
-e CLAWDBOT_INSTALL_TAG="${CLAWDBOT_INSTALL_TAG:-latest}" \
|
||||
-e CLAWDBOT_E2E_MODELS="$CLAWDBOT_E2E_MODELS" \
|
||||
-e CLAWDBOT_INSTALL_E2E_PREVIOUS="${CLAWDBOT_INSTALL_E2E_PREVIOUS:-}" \
|
||||
-e CLAWDBOT_INSTALL_E2E_SKIP_PREVIOUS="${CLAWDBOT_INSTALL_E2E_SKIP_PREVIOUS:-0}" \
|
||||
-e OPENCLAW_INSTALL_URL="$INSTALL_URL" \
|
||||
-e OPENCLAW_INSTALL_TAG="${OPENCLAW_INSTALL_TAG:-${CLAWDBOT_INSTALL_TAG:-latest}}" \
|
||||
-e OPENCLAW_E2E_MODELS="$OPENCLAW_E2E_MODELS" \
|
||||
-e OPENCLAW_INSTALL_E2E_PREVIOUS="${OPENCLAW_INSTALL_E2E_PREVIOUS:-${CLAWDBOT_INSTALL_E2E_PREVIOUS:-}}" \
|
||||
-e OPENCLAW_INSTALL_E2E_SKIP_PREVIOUS="${OPENCLAW_INSTALL_E2E_SKIP_PREVIOUS:-${CLAWDBOT_INSTALL_E2E_SKIP_PREVIOUS:-0}}" \
|
||||
-e OPENAI_API_KEY="$OPENAI_API_KEY" \
|
||||
-e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
|
||||
-e ANTHROPIC_API_TOKEN="$ANTHROPIC_API_TOKEN" \
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
IMAGE_NAME="${CLAWDBOT_IMAGE:-moltbot:local}"
|
||||
CONFIG_DIR="${CLAWDBOT_CONFIG_DIR:-$HOME/.clawdbot}"
|
||||
WORKSPACE_DIR="${CLAWDBOT_WORKSPACE_DIR:-$HOME/clawd}"
|
||||
PROFILE_FILE="${CLAWDBOT_PROFILE_FILE:-$HOME/.profile}"
|
||||
IMAGE_NAME="${OPENCLAW_IMAGE:-${CLAWDBOT_IMAGE:-openclaw:local}}"
|
||||
CONFIG_DIR="${OPENCLAW_CONFIG_DIR:-${CLAWDBOT_CONFIG_DIR:-$HOME/.openclaw}}"
|
||||
WORKSPACE_DIR="${OPENCLAW_WORKSPACE_DIR:-${CLAWDBOT_WORKSPACE_DIR:-$HOME/.openclaw/workspace}}"
|
||||
PROFILE_FILE="${OPENCLAW_PROFILE_FILE:-${CLAWDBOT_PROFILE_FILE:-$HOME/.profile}}"
|
||||
|
||||
PROFILE_MOUNT=()
|
||||
if [[ -f "$PROFILE_FILE" ]]; then
|
||||
@@ -21,12 +21,12 @@ docker run --rm -t \
|
||||
-e COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \
|
||||
-e HOME=/home/node \
|
||||
-e NODE_OPTIONS=--disable-warning=ExperimentalWarning \
|
||||
-e CLAWDBOT_LIVE_TEST=1 \
|
||||
-e CLAWDBOT_LIVE_GATEWAY_MODELS="${CLAWDBOT_LIVE_GATEWAY_MODELS:-all}" \
|
||||
-e CLAWDBOT_LIVE_GATEWAY_PROVIDERS="${CLAWDBOT_LIVE_GATEWAY_PROVIDERS:-}" \
|
||||
-e CLAWDBOT_LIVE_GATEWAY_MODEL_TIMEOUT_MS="${CLAWDBOT_LIVE_GATEWAY_MODEL_TIMEOUT_MS:-}" \
|
||||
-v "$CONFIG_DIR":/home/node/.clawdbot \
|
||||
-v "$WORKSPACE_DIR":/home/node/clawd \
|
||||
-e OPENCLAW_LIVE_TEST=1 \
|
||||
-e OPENCLAW_LIVE_GATEWAY_MODELS="${OPENCLAW_LIVE_GATEWAY_MODELS:-${CLAWDBOT_LIVE_GATEWAY_MODELS:-all}}" \
|
||||
-e OPENCLAW_LIVE_GATEWAY_PROVIDERS="${OPENCLAW_LIVE_GATEWAY_PROVIDERS:-${CLAWDBOT_LIVE_GATEWAY_PROVIDERS:-}}" \
|
||||
-e OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS="${OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS:-${CLAWDBOT_LIVE_GATEWAY_MODEL_TIMEOUT_MS:-}}" \
|
||||
-v "$CONFIG_DIR":/home/node/.openclaw \
|
||||
-v "$WORKSPACE_DIR":/home/node/.openclaw/workspace \
|
||||
"${PROFILE_MOUNT[@]}" \
|
||||
"$IMAGE_NAME" \
|
||||
-lc "set -euo pipefail; [ -f \"$HOME/.profile\" ] && source \"$HOME/.profile\" || true; cd /app && pnpm test:live"
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
IMAGE_NAME="${CLAWDBOT_IMAGE:-moltbot:local}"
|
||||
CONFIG_DIR="${CLAWDBOT_CONFIG_DIR:-$HOME/.clawdbot}"
|
||||
WORKSPACE_DIR="${CLAWDBOT_WORKSPACE_DIR:-$HOME/clawd}"
|
||||
PROFILE_FILE="${CLAWDBOT_PROFILE_FILE:-$HOME/.profile}"
|
||||
IMAGE_NAME="${OPENCLAW_IMAGE:-${CLAWDBOT_IMAGE:-openclaw:local}}"
|
||||
CONFIG_DIR="${OPENCLAW_CONFIG_DIR:-${CLAWDBOT_CONFIG_DIR:-$HOME/.openclaw}}"
|
||||
WORKSPACE_DIR="${OPENCLAW_WORKSPACE_DIR:-${CLAWDBOT_WORKSPACE_DIR:-$HOME/.openclaw/workspace}}"
|
||||
PROFILE_FILE="${OPENCLAW_PROFILE_FILE:-${CLAWDBOT_PROFILE_FILE:-$HOME/.profile}}"
|
||||
|
||||
PROFILE_MOUNT=()
|
||||
if [[ -f "$PROFILE_FILE" ]]; then
|
||||
@@ -21,13 +21,13 @@ docker run --rm -t \
|
||||
-e COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \
|
||||
-e HOME=/home/node \
|
||||
-e NODE_OPTIONS=--disable-warning=ExperimentalWarning \
|
||||
-e CLAWDBOT_LIVE_TEST=1 \
|
||||
-e CLAWDBOT_LIVE_MODELS="${CLAWDBOT_LIVE_MODELS:-all}" \
|
||||
-e CLAWDBOT_LIVE_PROVIDERS="${CLAWDBOT_LIVE_PROVIDERS:-}" \
|
||||
-e CLAWDBOT_LIVE_MODEL_TIMEOUT_MS="${CLAWDBOT_LIVE_MODEL_TIMEOUT_MS:-}" \
|
||||
-e CLAWDBOT_LIVE_REQUIRE_PROFILE_KEYS="${CLAWDBOT_LIVE_REQUIRE_PROFILE_KEYS:-}" \
|
||||
-v "$CONFIG_DIR":/home/node/.clawdbot \
|
||||
-v "$WORKSPACE_DIR":/home/node/clawd \
|
||||
-e OPENCLAW_LIVE_TEST=1 \
|
||||
-e OPENCLAW_LIVE_MODELS="${OPENCLAW_LIVE_MODELS:-${CLAWDBOT_LIVE_MODELS:-all}}" \
|
||||
-e OPENCLAW_LIVE_PROVIDERS="${OPENCLAW_LIVE_PROVIDERS:-${CLAWDBOT_LIVE_PROVIDERS:-}}" \
|
||||
-e OPENCLAW_LIVE_MODEL_TIMEOUT_MS="${OPENCLAW_LIVE_MODEL_TIMEOUT_MS:-${CLAWDBOT_LIVE_MODEL_TIMEOUT_MS:-}}" \
|
||||
-e OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS="${OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS:-${CLAWDBOT_LIVE_REQUIRE_PROFILE_KEYS:-}}" \
|
||||
-v "$CONFIG_DIR":/home/node/.openclaw \
|
||||
-v "$WORKSPACE_DIR":/home/node/.openclaw/workspace \
|
||||
"${PROFILE_MOUNT[@]}" \
|
||||
"$IMAGE_NAME" \
|
||||
-lc "set -euo pipefail; [ -f \"$HOME/.profile\" ] && source \"$HOME/.profile\" || true; cd /app && pnpm test:live"
|
||||
|
||||
@@ -23,10 +23,10 @@ const isCI = process.env.CI === "true" || process.env.GITHUB_ACTIONS === "true";
|
||||
const isMacOS = process.platform === "darwin" || process.env.RUNNER_OS === "macOS";
|
||||
const isWindows = process.platform === "win32" || process.env.RUNNER_OS === "Windows";
|
||||
const isWindowsCi = isCI && isWindows;
|
||||
const shardOverride = Number.parseInt(process.env.CLAWDBOT_TEST_SHARDS ?? "", 10);
|
||||
const shardOverride = Number.parseInt(process.env.OPENCLAW_TEST_SHARDS ?? "", 10);
|
||||
const shardCount = isWindowsCi ? (Number.isFinite(shardOverride) && shardOverride > 1 ? shardOverride : 2) : 1;
|
||||
const windowsCiArgs = isWindowsCi ? ["--no-file-parallelism", "--dangerouslyIgnoreUnhandledErrors"] : [];
|
||||
const overrideWorkers = Number.parseInt(process.env.CLAWDBOT_TEST_WORKERS ?? "", 10);
|
||||
const overrideWorkers = Number.parseInt(process.env.OPENCLAW_TEST_WORKERS ?? "", 10);
|
||||
const resolvedOverride = Number.isFinite(overrideWorkers) && overrideWorkers > 0 ? overrideWorkers : null;
|
||||
const parallelRuns = isWindowsCi ? [] : runs.filter((entry) => entry.name !== "gateway");
|
||||
const serialRuns = isWindowsCi ? runs : runs.filter((entry) => entry.name === "gateway");
|
||||
|
||||
@@ -3,7 +3,7 @@ import { readFileSync, writeFileSync } from "node:fs";
|
||||
import { resolve } from "node:path";
|
||||
import type { ApiContributor, Entry, MapConfig, User } from "./update-clawtributors.types.js";
|
||||
|
||||
const REPO = "moltbot/moltbot";
|
||||
const REPO = "openclaw/openclaw";
|
||||
const PER_LINE = 10;
|
||||
|
||||
const mapPath = resolve("scripts/clawtributors-map.json");
|
||||
|
||||
@@ -5,7 +5,7 @@ import process from "node:process";
|
||||
const args = process.argv.slice(2);
|
||||
const env = { ...process.env };
|
||||
const cwd = process.cwd();
|
||||
const compiler = env.CLAWDBOT_TS_COMPILER === "tsc" ? "tsc" : "tsgo";
|
||||
const compiler = env.OPENCLAW_TS_COMPILER === "tsc" ? "tsc" : "tsgo";
|
||||
const projectArgs = ["--project", "tsconfig.json"];
|
||||
|
||||
const initialBuild = spawnSync("pnpm", ["exec", compiler, ...projectArgs], {
|
||||
@@ -29,7 +29,7 @@ const compilerProcess = spawn("pnpm", ["exec", compiler, ...watchArgs], {
|
||||
stdio: "inherit",
|
||||
});
|
||||
|
||||
const nodeProcess = spawn(process.execPath, ["--watch", "moltbot.mjs", ...args], {
|
||||
const nodeProcess = spawn(process.execPath, ["--watch", "openclaw.mjs", ...args], {
|
||||
cwd,
|
||||
env,
|
||||
stdio: "inherit",
|
||||
|
||||
@@ -75,10 +75,10 @@ async function main() {
|
||||
}
|
||||
|
||||
const baseDir = await fs.mkdtemp(
|
||||
path.join(os.tmpdir(), "moltbot-zai-fallback-"),
|
||||
path.join(os.tmpdir(), "openclaw-zai-fallback-"),
|
||||
);
|
||||
const stateDir = path.join(baseDir, "state");
|
||||
const configPath = path.join(baseDir, "moltbot.json");
|
||||
const configPath = path.join(baseDir, "openclaw.json");
|
||||
await fs.mkdir(stateDir, { recursive: true });
|
||||
|
||||
const config = {
|
||||
@@ -98,10 +98,14 @@ async function main() {
|
||||
await fs.writeFile(configPath, JSON.stringify(config, null, 2), "utf8");
|
||||
|
||||
const sessionId =
|
||||
process.env.CLAWDBOT_ZAI_FALLBACK_SESSION_ID ?? randomUUID();
|
||||
process.env.OPENCLAW_ZAI_FALLBACK_SESSION_ID ??
|
||||
process.env.CLAWDBOT_ZAI_FALLBACK_SESSION_ID ??
|
||||
randomUUID();
|
||||
|
||||
const baseEnv: NodeJS.ProcessEnv = {
|
||||
...process.env,
|
||||
OPENCLAW_CONFIG_PATH: configPath,
|
||||
OPENCLAW_STATE_DIR: stateDir,
|
||||
CLAWDBOT_CONFIG_PATH: configPath,
|
||||
CLAWDBOT_STATE_DIR: stateDir,
|
||||
ZAI_API_KEY: zaiKey,
|
||||
@@ -127,7 +131,7 @@ async function main() {
|
||||
const run1 = await runCommand(
|
||||
"run1",
|
||||
[
|
||||
"moltbot",
|
||||
"openclaw",
|
||||
"agent",
|
||||
"--local",
|
||||
"--session-id",
|
||||
@@ -159,7 +163,7 @@ async function main() {
|
||||
const run2 = await runCommand(
|
||||
"run2",
|
||||
[
|
||||
"moltbot",
|
||||
"openclaw",
|
||||
"agent",
|
||||
"--local",
|
||||
"--session-id",
|
||||
|
||||
Reference in New Issue
Block a user