#!/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 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 &'\""