้กน็›ฎๆ–‡ไปถๅคน

ๆ–‡ไปถ
2026-07-13 13:32:32 +08:00

166 ่กŒ
5.9 KiB
Bash

ๆญคๆ–‡ไปถๅซๆœ‰ๆจกๆฃฑไธคๅฏ็š„ Unicode ๅญ—็ฌฆ
ๆญคๆ–‡ไปถๅซๆœ‰ๅฏ่ƒฝไผšไธŽๅ…ถไป–ๅญ—็ฌฆๆททๆท†็š„ Unicode ๅญ—็ฌฆใ€‚ ๅฆ‚ๆžœๆ‚จๆ˜ฏๆƒณ็‰นๆ„่ฟ™ๆ ท็š„๏ผŒๅฏไปฅๅฎ‰ๅ…จๅœฐๅฟฝ็•ฅ่ฏฅ่ญฆๅ‘Šใ€‚ ไฝฟ็”จ Escape ๆŒ‰้’ฎๆ˜พ็คบไป–ไปฌใ€‚
#!/bin/bash
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# ไธ‰็œๅ…ญ้ƒจ ยท OpenClaw Multi-Agent System ไธ€้”ฎๅธ่ฝฝ่„šๆœฌ
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
set -e
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
OC_HOME="$HOME/.openclaw"
OC_CFG="$OC_HOME/openclaw.json"
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m'
banner() {
echo ""
echo -e "${BLUE}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}"
echo -e "${BLUE}โ•‘ ๐Ÿ›๏ธ ไธ‰็œๅ…ญ้ƒจ ยท ๅธ่ฝฝๅ‘ๅฏผ โ•‘${NC}"
echo -e "${BLUE}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
echo ""
}
log() { echo -e "${GREEN}โœ… $1${NC}"; }
warn() { echo -e "${YELLOW}โš ๏ธ $1${NC}"; }
info() { echo -e "${BLUE}โ„น๏ธ $1${NC}"; }
# โ”€โ”€ Step 0: ็กฎ่ฎค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
check_env() {
info "ๆฃ€ๆŸฅ็Žฏๅขƒ..."
if ! command -v python3 &>/dev/null; then
warn "ๆœชๆ‰พๅˆฐ python3๏ผŒ่ทณ่ฟ‡ๆธ…็†้…็ฝฎ้กน"
fi
echo ""
echo -e "${YELLOW}็กฎๅฎš่ฆๅธ่ฝฝใ€Œไธ‰็œๅ…ญ้ƒจใ€็ณป็ปŸๅนถๆธ…็†็›ธๅ…ณ Agent ๆ•ฐๆฎๅ—๏ผŸ${NC}"
read -p "(y/N) " -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
info "ๅทฒๅ–ๆถˆๅธ่ฝฝ"
exit 0
fi
}
# โ”€โ”€ Step 1: ๅœๆญขๆญฃๅœจ่ฟ่กŒ็š„ๆœๅŠก โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
stop_services() {
info "ๅฐ่ฏ•ๅœๆญข็›ธๅ…ณ่ฟ›็จ‹..."
if pgrep -f "scripts/run_loop.sh" > /dev/null 2>&1; then
pkill -f "scripts/run_loop.sh" || warn "ๆ— ๆณ•่‡ชๅŠจๅœๆญข run_loop.sh"
log "ๅทฒๅฐ่ฏ•ๅœๆญข run_loop.sh"
fi
if pgrep -f "python.*dashboard/server.py" > /dev/null 2>&1; then
pkill -f "python.*dashboard/server.py" || warn "ๆ— ๆณ•่‡ชๅŠจๅœๆญข dashboard/server.py"
log "ๅทฒๅฐ่ฏ•ๅœๆญข dashboard/server.py"
fi
}
# โ”€โ”€ Step 2: ๆธ…็† OpenClaw ๆณจๅ†Œ้…็ฝฎ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
unregister_agents() {
info "ไปŽ OpenClaw ็งป้™คไธ‰็œๅ…ญ้ƒจ Agents ๆณจๅ†Œไฟกๆฏ..."
if [ ! -f "$OC_CFG" ]; then
warn "ๆœชๆ‰พๅˆฐ openclaw.json๏ผŒ่ทณ่ฟ‡้…็ฝฎๆธ…็†"
return
fi
cp "$OC_CFG" "$OC_CFG.bak.pre-uninstall-$(date +%Y%m%d-%H%M%S)"
log "ๅทฒๅค‡ไปฝๅฝ“ๅ‰้…็ฝฎ"
python3 << 'PYEOF'
import json, pathlib
cfg_path = pathlib.Path.home() / '.openclaw' / 'openclaw.json'
if not cfg_path.exists():
print(" openclaw.json ไธๅญ˜ๅœจใ€‚")
exit(0)
try:
cfg = json.loads(cfg_path.read_text(encoding='utf-8'))
except Exception as e:
print(f" ่งฃๆž openclaw.json ๅคฑ่ดฅ: {e}")
exit(1)
AGENTS_TO_REMOVE = {
"taizi", "zhongshu", "menxia", "shangshu",
"hubu", "libu", "bingbu", "xingbu", "gongbu",
"libu_hr", "zaochao"
}
agents_list = cfg.get('agents', {}).get('list', [])
new_list = [a for a in agents_list if a.get('id') not in AGENTS_TO_REMOVE]
removed_count = len(agents_list) - len(new_list)
if 'agents' in cfg:
cfg['agents']['list'] = new_list
cfg_path.write_text(json.dumps(cfg, ensure_ascii=False, indent=2), encoding='utf-8')
print(f" ๆˆๅŠŸ็งป้™คไบ† {removed_count} ไธช Agent ็š„ๆณจๅ†Œไฟกๆฏ")
PYEOF
log "ๆณจๅ†Œไฟกๆฏๆธ…็†ๅฎŒๆˆ"
}
# โ”€โ”€ Step 3: ๆธ…้™ค Workspace ็›ฎๅฝ• โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
remove_workspaces() {
info "ๆธ…้™ค Agent Workspace ็›ฎๅฝ•..."
AGENTS=(taizi zhongshu menxia shangshu hubu libu bingbu xingbu gongbu libu_hr zaochao)
removed=0
for agent in "${AGENTS[@]}"; do
ws="$OC_HOME/workspace-$agent"
if [ -d "$ws" ]; then
rm -rf "$ws"
removed=$((removed+1))
fi
done
log "ๆˆๅŠŸๆธ…็†ไบ† $removed ไธช Workspace ็›ฎๅฝ•"
}
# โ”€โ”€ Step 4: ๆธ…้™คๆœฌๅœฐๆ•ฐๆฎ็ผ“ๅญ˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
remove_data() {
info "ๆธ…้™คๆœฌๅœฐ data ็ผ“ๅญ˜..."
echo -e "${YELLOW}ๆ˜ฏๅฆ้œ€่ฆๅˆ ้™ค้กน็›ฎๅ†…็š„ data ็›ฎๅฝ•ๅŠๅทฒ็”Ÿๆˆ็š„ๆ•ฐๆฎ๏ผŸ${NC}"
read -p "(y/N) " -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
if [ -d "$REPO_DIR/data" ]; then
rm -rf "$REPO_DIR/data"
log "ๅทฒๅˆ ้™ค $REPO_DIR/data"
else
warn "$REPO_DIR/data ไธๅญ˜ๅœจ"
fi
else
info "ไฟ็•™ๅŽŸๆœ‰ data ็›ฎๅฝ•"
fi
}
# โ”€โ”€ Step 5: ้‡ๅฏ Gateway โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
restart_gateway() {
info "้‡ๅฏ OpenClaw Gateway ไปฅๅบ”็”จ้…็ฝฎ..."
if command -v openclaw &>/dev/null; then
if openclaw gateway restart 2>/dev/null; then
log "Gateway ้‡ๅฏๆˆๅŠŸ"
else
warn "Gateway ้‡ๅฏๅคฑ่ดฅ๏ผŒ่ฏทๆ‰‹ๅŠจ้‡ๅฏ๏ผšopenclaw gateway restart"
fi
else
warn "ๆœชๆ‰พๅˆฐ openclaw ๅ‘ฝไปค่กŒๅทฅๅ…ท๏ผŒ่ทณ่ฟ‡้‡ๅฏ Gateway"
fi
}
# โ”€โ”€ Main โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
banner
check_env
stop_services
unregister_agents
remove_workspaces
remove_data
restart_gateway
echo ""
echo -e "${GREEN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}"
echo -e "${GREEN}โ•‘ โœ… ไธ‰็œๅ…ญ้ƒจๅธ่ฝฝๅฎŒๆˆ๏ผ โ•‘${NC}"
echo -e "${GREEN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
echo ""