deploy-to-phone.sh
3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/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 &'\""