deploy-to-phone.sh 3.23 KB
#!/bin/bash
# deploy-to-phone.sh — 把 wechat 运行时代码 + 文档推送到 Pixel 的 hermes-wechat 运行目录
#
# 在 Mac 上运行。机制:adb push 到 /sdcard 中转 → su dd 落到 /data/data → chown 回 Termux uid。
#   - 用 dd 而不是 cp:避开 phone 上 dash shell snapshot hook 往 *.js 末尾追内容的坑
#   - chown 回 u0_a327:否则 adb/root 写出来的文件属主是 root,claude-run(u0_a327) 改不动
#   - 推完做 md5 校验
#
# 用法:
#   ./deploy-to-phone.sh [手机目标目录]
#   默认目标: /data/data/com.termux/files/home/hermes-wechat/

set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PHONE_DIR="${1:-/data/data/com.termux/files/home/hermes-wechat}"
TERMUX_UID="${TERMUX_UID:-u0_a327}"   # Termux app 的 uid(claude-run 也是它)。换机器需改。

# 运行时必需:auto-reply.js 只 require 这三个文件,bot 实跑就这些
RUNTIME="auto-reply.js android-wechat-tracker-sqlcipher.js android-wechat-sender.js"
# 文档(接手 / 维护必读)。AGENTS.md/CLAUDE.md 是 agent 一次性读的入口
DOCS="AGENTS.md CLAUDE.md HANDOFF.md HANDOFF_PROMPTS.md README.md SKILL.md"
# 守护脚本(改了要手动重启 keepalive,见末尾提示)
SCRIPTS="keepalive.sh"
FILES="$RUNTIME $DOCS $SCRIPTS"

# md5 工具:Mac 用 `md5 -q`,Linux 用 `md5sum`
md5_local() {
  if command -v md5 >/dev/null 2>&1; then md5 -q "$1"; else md5sum "$1" | awk '{print $1}'; fi
}

echo "=== Deploying wechat runtime + docs to phone ==="
echo "Source: $SCRIPT_DIR"
echo "Target: $PHONE_DIR  (owner -> $TERMUX_UID)"
echo ""

adb shell "su -c 'mkdir -p $PHONE_DIR'"

fail=0
for f in $FILES; do
  if [ ! -f "$SCRIPT_DIR/$f" ]; then echo "SKIP (missing) $f"; continue; fi
  case "$f" in *.sh) mode=755;; *) mode=644;; esac
  echo "Pushing $f ..."
  adb push "$SCRIPT_DIR/$f" "/sdcard/_deploy_$f" >/dev/null
  adb shell "su -c 'dd if=/sdcard/_deploy_$f of=$PHONE_DIR/$f 2>/dev/null && chown $TERMUX_UID:$TERMUX_UID $PHONE_DIR/$f && chmod $mode $PHONE_DIR/$f'"
  adb shell "rm -f /sdcard/_deploy_$f" >/dev/null 2>&1 || true
  lmd5=$(md5_local "$SCRIPT_DIR/$f")
  pmd5=$(adb shell "su -c 'md5sum $PHONE_DIR/$f'" | awk '{print $1}' | tr -d '\r')
  if [ "$lmd5" = "$pmd5" ]; then echo "  ok ($lmd5)"; else echo "  !! MD5 MISMATCH  local=$lmd5  phone=$pmd5"; fail=1; fi
done

echo ""
if [ "$fail" = 0 ]; then echo "=== Deploy OK ==="; else echo "=== Deploy had MD5 mismatches — check above ==="; fi
echo ""
echo "重启 bot 让新代码生效(keepalive 会在 ~15s 内自动以 root 重新拉起):"
echo "  adb shell \"su -c 'pkill -f auto-reply.js'\""
echo "确认新进程起来了(不能用 pgrep -f,会自匹配 su shell):"
echo "  adb shell \"su -c 'ps -ef | grep -E node.auto-reply.js | grep -v grep'\""
echo "看 live 日志(注意:唯一真日志在 hermes-wechat/,别处副本是死的):"
echo "  adb shell \"su -c 'tail -f $PHONE_DIR/auto-reply.log'\""
echo ""
echo "若改了 keepalive.sh,需重启守护进程才生效(它以 u0_a327 跑):"
echo "  adb shell \"su -c 'pkill -f keepalive.sh'\"  # 杀掉旧的"
echo "  adb shell \"su u0_a327 -c 'cd $PHONE_DIR && export PATH=/data/data/com.termux/files/usr/bin:\\\$PATH HOME=/data/data/com.termux/files/home; nohup bash keepalive.sh > keepalive.log 2>&1 &'\""