#!/bin/bash # D16 南带补线上服务器(CLAUDE.md:布线运算只在 10.5.5.13 跑)。 # # bash .claude/r2/remote_d16.sh [NET=宽度 ...] # # 前提:本机已把板上快照写成 .claude/r2/_board_for_nets.json(旧入口的铜已删)。 # 结果拉回 .claude/r2/_d16_route.out.json / _d16_route.log,**不下发** —— 本机复核净距之后再下发。 set -euo pipefail SERVER=${SERVER:-10.5.5.13} INTERP=${INTERP:-/root/pypy/bin/pypy3} SSH=/c/Windows/System32/OpenSSH/ssh.exe SCP=/c/Windows/System32/OpenSSH/scp.exe REPO=$(cd "$(dirname "$0")/../.." && pwd) cd "$REPO" [ -f .claude/r2/_board_for_nets.json ] || { echo '缺 _board_for_nets.json(先抓板)'; exit 1; } TMP=${TMPDIR:-/tmp} TGZ=$(mktemp -u "$TMP/d16-route-XXXXXX").tgz tar --exclude='*.png' --exclude='*.bak' --exclude='__pycache__' --exclude='archive_*' \ --exclude='_base_routes.r*' --exclude='_blade_routes.*' --exclude='_base_board_*' -czf "$TGZ" \ .claude/r2 .claude/eda.py .claude/eda-parts.json .claude/pcb_pour.py R=$("$SSH" "$SERVER" 'mktemp -d /tmp/dcdc-d16.XXXXXX' | tr -d '\r') case "$R" in /tmp/dcdc-d16.*) ;; *) echo "远程目录不对: $R"; exit 1 ;; esac cleanup() { rm -f "$TGZ" # ⚠ `[.]claude` 是故意的:直接写目录串的话 pkill 会先把执行这条命令的远程 shell 杀掉 "$SSH" "$SERVER" "pkill -f '$R/[.]claude/r2/d16_route' ; rm -rf -- '$R'" || true } trap cleanup EXIT "$SCP" -q "$(cygpath -w "$TGZ")" "$SERVER:$R/b.tgz" "$SSH" "$SERVER" "tar -xzf $R/b.tgz -C $R" # MODE=gnd:d16_gndfix.py(给指定 GND 焊盘各打一个孔),拉回 _d16_gndfix.out.json if [ "${MODE:-route}" = gnd ]; then "$SSH" "$SERVER" "cd $R && DCDC_ROUTE_SERVER=1 $INTERP .claude/r2/d16_gndfix.py $* 2>&1" | tee .claude/r2/_d16_gndfix.log "$SCP" -q "$SERVER:$R/.claude/r2/_d16_gndfix.out.json" .claude/r2/_d16_gndfix.out.json echo "已拉回 .claude/r2/_d16_gndfix.out.json(未下发)" exit 0 fi # MODE=rip:d16_rip.py(拆 U13 I²C 三线束,连同 CH224A 的 SDA/SCL 一起重布;只改数据不动板),拉回 _d16_rip.out.json if [ "${MODE:-route}" = rip ]; then "$SSH" "$SERVER" "cd $R && DCDC_ROUTE_SERVER=1 $INTERP .claude/r2/d16_rip.py $* 2>&1" | tee .claude/r2/_d16_rip.log "$SCP" -q "$SERVER:$R/.claude/r2/_d16_rip.out.json" .claude/r2/_d16_rip.out.json echo "已拉回 .claude/r2/_d16_rip.out.json(未下发)" exit 0 fi # MODE=tap:d16_tap.py(孤立小块接到本网已有铜上,大块不挑焊盘代表),拉回 _d16_tap.out.json if [ "${MODE:-route}" = tap ]; then "$SSH" "$SERVER" "cd $R && DCDC_ROUTE_SERVER=1 $INTERP .claude/r2/d16_tap.py $* 2>&1" | tee .claude/r2/_d16_tap.log "$SCP" -q "$SERVER:$R/.claude/r2/_d16_tap.out.json" .claude/r2/_d16_tap.out.json echo "已拉回 .claude/r2/_d16_tap.out.json(未下发)" exit 0 fi # MODE=nets:只补给定的网(route_nets.py:板上铜全当障碍,按连通块接起来),拉回 _route_nets.out.json if [ "${MODE:-route}" = nets ]; then "$SSH" "$SERVER" "cd $R && DCDC_ROUTE_SERVER=1 $INTERP .claude/r2/route_nets.py $* 2>&1" | tee .claude/r2/_route_nets.log "$SCP" -q "$SERVER:$R/.claude/r2/_route_nets.out.json" .claude/r2/_route_nets.out.json echo "已拉回 .claude/r2/_route_nets.out.json(未下发)" exit 0 fi # MODE=reach:不布线,跑 d16_reach.py(SDA6 / SCL6 在布线网格上的泛洪诊断),拉回 _d16_reach.out.json if [ "${MODE:-route}" = reach ]; then "$SSH" "$SERVER" "cd $R && DCDC_ROUTE_SERVER=1 $INTERP .claude/r2/d16_reach.py $* 2>&1" | tee .claude/r2/_d16_reach.log "$SCP" -q "$SERVER:$R/.claude/r2/_d16_reach.out.json" .claude/r2/_d16_reach.out.json echo "已拉回 .claude/r2/_d16_reach.out.json" exit 0 fi "$SSH" "$SERVER" "cd $R && DCDC_ROUTE_SERVER=1 /usr/bin/time -f 'REMOTE_TIME=%e sec RSS=%M KB' $INTERP .claude/r2/d16_route.py $* 2>&1" \ | tee .claude/r2/_d16_route.log "$SCP" -q "$SERVER:$R/.claude/r2/_d16_route.out.json" .claude/r2/_d16_route.out.json echo "已拉回 .claude/r2/_d16_route.out.json(未下发)"