Claude code远程调试边缘设备工具

Remote Execute Claude

使用 Claude Code 调试远程边缘设备(不具备claude code使用条件)的完整工具集,用于提高在边缘设备上问题分析和调试效率。本地编辑,远程运行,让 AI 辅助开发边缘设备、嵌入式系统和远程服务器。

📂 工具目录结构

复制代码
/Users/admin/bin/remote_execute_claude/    # 工具安装目录
├── quickstart.sh                          # 一键安装向导(推荐)
├── setup_environment.sh                   # 安装依赖工具
├── setup_ssh.sh                          # 配置 SSH 连接和远程设备
├── create_project.sh                     # 创建项目并生成配置
├── remote_toolkit.sh                     # 主工具脚本(模板)
├── templates/                            # 模板文件
│   └── CLAUDE.md.template               # Claude Code 上下文模板
└── devices/                              # 设备配置(自动生成)
    └── *.conf                           # 远程设备连接信息

使用流程

  1. 在工具目录运行安装脚本(quickstart.sh 或分步安装)
  2. 配置远程设备连接(setup_ssh.sh
  3. 创建项目(create_project.sh)→ 工具会复制到项目目录
  4. 在项目目录使用 ./remote_toolkit.sh 命令

📋 目录

📋 功能特性

无缝同步 - 自动同步本地和远程文件,只传输变更部分

远程执行 - 在远程设备上执行命令并查看结果

实时监控 - 监控文件变化并自动同步(watch 模式)

日志查看 - 实时查看远程设备日志文件

Claude Code 集成 - 完美配合 Claude Code 使用

跨平台 - 支持 macOS 和 Linux

安全连接 - 使用 SSH 密钥认证

智能过滤 - 自动排除不需要同步的文件

🚀 快速开始

一键安装(推荐)

bash 复制代码
cd /Users/admin/bin/remote_execute_claude
./quickstart.sh

快速向导会自动完成:环境安装 → SSH 配置 → 项目创建。

手动安装(三步)

bash 复制代码
# 1. 安装依赖工具(rsync, jq, fswatch/inotify-tools)
./setup_environment.sh

# 2. 配置 SSH 密钥和远程设备连接
./setup_ssh.sh
# 输入:设备昵称、IP、用户名、端口

# 3. 创建项目
./create_project.sh
# 选择设备,设置本地和远程路径

开始使用

bash 复制代码
# 终端 1 - 启动自动同步
cd ~/my-project
./remote_toolkit.sh watch

# 终端 2 - 启动 Claude Code
cd ~/my-project
claude

🔧 配置远程设备

什么是远程设备?

远程设备是指需要远程连接的目标机器,例如:

  • 🍓 树莓派(Raspberry Pi)
  • 🤖 边缘计算设备(Jetson Nano 等)
  • 📟 嵌入式系统(工控机、开发板)
  • 🖥️ 远程服务器(Linux 服务器)

配置步骤详解

方式一:使用 quickstart.sh(推荐)

运行快速向导时会自动引导你完成设备配置:

bash 复制代码
cd /Users/admin/bin/remote_execute_claude
./quickstart.sh

向导会询问:

  • 设备昵称 :给设备起个名字,如 raspberry-piedge-device-1
  • 设备 IP :远程设备的 IP 地址,如 192.168.1.100
  • 用户名 :SSH 登录用户,如 piubunturoot
  • SSH 端口 :默认 22,自定义端口需要修改
方式二:单独配置设备
bash 复制代码
cd /Users/admin/bin/remote_execute_claude
./setup_ssh.sh

脚本会自动完成

  1. ✅ 生成 SSH 密钥对(如果不存在)
  2. ✅ 将公钥复制到远程设备(免密登录)
  3. ✅ 配置 ~/.ssh/config 文件
  4. ✅ 启用连接复用(提升同步速度)
  5. ✅ 测试连接是否成功
  6. ✅ 保存设备配置到 devices/设备名.conf

配置多个设备

可以配置多个远程设备,在不同项目中使用:

bash 复制代码
# 配置第一个设备
./setup_ssh.sh
# 输入:rpi-1, 192.168.1.100, pi

# 配置第二个设备
./setup_ssh.sh
# 输入:rpi-2, 192.168.1.101, pi

# 配置生产服务器
./setup_ssh.sh
# 输入:prod-server, 10.0.0.50, ubuntu

配置完成后,设备信息保存在 devices/ 目录。

验证配置

bash 复制代码
# 测试 SSH 连接(使用配置的昵称)
ssh raspberry-pi

# 如果能免密登录成功,说明配置正确

🚀 在项目中使用

创建项目并关联设备

配置好远程设备后,需要为每个项目创建配置:

bash 复制代码
cd /Users/admin/bin/remote_execute_claude
./create_project.sh

向导会询问

  1. 选择远程设备

    复制代码
    已配置的设备:
    1) raspberry-pi (192.168.1.100)
    2) edge-device-1 (192.168.1.101)
    选择: 1
  2. 本地项目目录

    复制代码
    本地项目目录: ~/my-iot-project
    • 可以输入已存在的目录
    • 或输入新目录名(会自动创建)
  3. 远程项目路径

    复制代码
    远程项目路径: /home/pi/my-iot-project
    • 远程设备上的目标目录
    • 脚本会自动在远程创建此目录
  4. 自定义排除项(可选)

    复制代码
    额外排除的文件: *.tmp *.bak

项目创建后的目录结构

复制代码
~/my-iot-project/                         # 你的项目目录
├── .remote-config.json                   # 远程配置文件
├── remote_toolkit.sh                     # 工具脚本(从工具目录复制)
├── CLAUDE.md                            # Claude Code 上下文
├── README.md                            # 项目说明
├── .gitignore                           # Git 忽略规则
└── [你的代码文件]                        # 开始编写代码

在项目目录中使用工具

进入项目目录后,所有操作都通过 ./remote_toolkit.sh 完成:

bash 复制代码
cd ~/my-iot-project

# 查看设备连接状态
./remote_toolkit.sh status

# 启动自动同步(推荐在开发时保持运行)
./remote_toolkit.sh watch

# 手动同步文件
./remote_toolkit.sh sync-to

# 远程执行代码
./remote_toolkit.sh exec "python main.py"

# 查看远程日志
./remote_toolkit.sh logs "app.log"

# 读取远程文件
./remote_toolkit.sh read "config.yaml"

# 进入远程终端
./remote_toolkit.sh shell

切换项目使用不同设备

每个项目都有独立的 .remote-config.json,可以连接不同的远程设备:

bash 复制代码
# 项目 A 使用树莓派
cd ~/project-a
cat .remote-config.json
# "host": "raspberry-pi"

# 项目 B 使用边缘设备
cd ~/project-b
cat .remote-config.json
# "host": "edge-device-1"

🎯 核心命令

remote_toolkit.sh 命令速查

命令 说明 示例
status 查看远程设备连接状态 ./remote_toolkit.sh status
sync-to 手动同步本地 → 远程 ./remote_toolkit.sh sync-to
sync-from 同步远程 → 本地(自动备份) ./remote_toolkit.sh sync-from
watch ⭐ 自动监控并实时同步 ./remote_toolkit.sh watch
exec "命令" ⭐ 在远程执行命令 ./remote_toolkit.sh exec "python main.py"
read "文件" 读取远程文件内容 ./remote_toolkit.sh read "config.yaml"
logs "文件" 实时查看远程日志 ./remote_toolkit.sh logs "app.log"
shell 打开远程交互式终端 ./remote_toolkit.sh shell

常用命令示例

bash 复制代码
# 开发时:启动自动同步(推荐持续运行)
./remote_toolkit.sh watch

# 在远程执行代码
./remote_toolkit.sh exec "python main.py"
./remote_toolkit.sh exec "npm test"
./remote_toolkit.sh exec "pytest tests/ -v"

# 安装依赖
./remote_toolkit.sh exec "pip install -r requirements.txt"
./remote_toolkit.sh exec "npm install"

# 查看日志和文件
./remote_toolkit.sh logs "app.log"
./remote_toolkit.sh read "config.yaml"

# 获取远程生成的数据
./remote_toolkit.sh sync-from

# 检查连接状态
./remote_toolkit.sh status

💼 典型工作流

场景 1:AI 辅助开发(推荐)

bash 复制代码
# 终端 1:启动自动同步
cd ~/my-project
./remote_toolkit.sh watch

# 终端 2:启动 Claude Code
claude

# 告诉 Claude 你的需求,它会:
# 1. 编辑代码(自动同步到远程)
# 2. 调用 ./remote_toolkit.sh exec 执行测试
# 3. 查看日志分析问题
# 4. 根据结果继续优化

场景 2:开发 Python 应用

bash 复制代码
# 安装依赖
./remote_toolkit.sh exec "pip install -r requirements.txt"

# 运行程序
./remote_toolkit.sh exec "python main.py"

# 运行测试
./remote_toolkit.sh exec "pytest tests/ -v"

# 实时查看日志
./remote_toolkit.sh logs "app.log"

场景 3:调试错误

bash 复制代码
# 查看错误日志
./remote_toolkit.sh read "logs/error.log"

# 或实时监控
./remote_toolkit.sh logs "logs/error.log"

# 修改代码后重新运行
./remote_toolkit.sh exec "python main.py --debug"

场景 4:获取远程数据

bash 复制代码
# 运行数据处理
./remote_toolkit.sh exec "python process_data.py"

# 拉取到本地(自动备份)
./remote_toolkit.sh sync-from

🤖 Claude Code 集成

为什么要配合 Claude Code?

本工具专为 Claude Code 设计,让 AI 能够:

  • ✅ 在本地编辑代码
  • ✅ 自动同步到远程设备
  • ✅ 远程执行并查看结果
  • ✅ 根据反馈迭代优化

使用方式

bash 复制代码
# 1. 启动自动同步(终端 1)
./remote_toolkit.sh watch

# 2. 启动 Claude(终端 2)
claude

无需手动说明项目背景CLAUDE.md 会自动生成,Claude 会自动理解:

  • 本地只用于编辑
  • 远程用于执行
  • 如何调用 remote_toolkit.sh

示例对话

你说

复制代码
实现一个 HTTP 服务器,监听 8080 端口,提供 /api/status 接口

Claude 会自动

  1. 创建/编辑代码文件(自动同步到远程)
  2. 调用 ./remote_toolkit.sh exec "python server.py" 测试
  3. 查看日志分析问题
  4. 迭代优化直到正常运行

你说

复制代码
程序报错了,帮我修复

Claude 会自动

  1. 调用 ./remote_toolkit.sh read "logs/error.log" 查看错误
  2. 分析问题并修改代码
  3. 重新测试验证修复

⚙️ 配置文件详解

1. 项目配置文件:.remote-config.json

位置 :项目根目录(如 ~/my-project/.remote-config.json
作用 :定义项目与远程设备的连接信息和同步规则
生成 :运行 create_project.sh 时自动创建

配置示例
json 复制代码
{
  "host": "raspberry-pi",                  // 远程设备昵称
  "user": "pi",                            // SSH 登录用户
  "port": 22,                              // SSH 端口
  "project_path": "/home/pi/my-project",   // 远程项目路径
  "exclude": [                             // 不同步的文件
    "node_modules", "__pycache__", ".git", "venv",
    "*.pyc", "*.log", ".DS_Store",
    "CLAUDE.md", "README.md", "remote_toolkit.sh",
    ".remote-config.json", ".backup"
  ]
}
字段详解
字段 说明 如何填写
host 远程设备昵称 必须与 setup_ssh.sh 配置的设备名一致
user SSH 登录用户 树莓派通常是 pi,Ubuntu 是 ubuntu
port SSH 端口 默认 22,自定义端口需修改
project_path 远程项目目录 绝对路径,如 /home/pi/project
exclude 排除同步的文件 支持通配符,如 *.lognode_modules/
修改配置
bash 复制代码
# 方式 1: 直接编辑
vim .remote-config.json

# 方式 2: 使用 jq 命令
jq '.project_path = "/new/path"' .remote-config.json > .tmp
mv .tmp .remote-config.json

# 方式 3: 让 Claude Code 修改
# 在 Claude 中说:"修改 .remote-config.json,将远程路径改为 /new/path"
切换远程设备

如果想让项目连接到不同的远程设备:

bash 复制代码
# 修改 host 字段为其他已配置的设备
jq '.host = "edge-device-2"' .remote-config.json > .tmp
mv .tmp .remote-config.json

# 验证连接
./remote_toolkit.sh status

2. 设备配置文件:devices/*.conf

位置/Users/admin/bin/remote_execute_claude/devices/
作用 :保存已配置的远程设备信息
生成 :运行 setup_ssh.sh 时自动创建

配置示例
bash 复制代码
# devices/raspberry-pi.conf
DEVICE_NAME="raspberry-pi"
DEVICE_HOST="192.168.1.100"
DEVICE_USER="pi"
DEVICE_PORT="22"
SSH_KEY_PATH="$HOME/.ssh/raspberry_pi_key"

说明

  • 每个设备一个 .conf 文件
  • 文件名与设备昵称对应
  • create_project.sh 读取,用于创建项目配置

3. SSH 配置文件:~/.ssh/config

位置~/.ssh/config
作用 :SSH 客户端配置,实现免密登录和连接复用
生成 :运行 setup_ssh.sh 时自动添加

配置示例
ssh-config 复制代码
Host raspberry-pi
    HostName 192.168.1.100
    User pi
    Port 22
    IdentityFile ~/.ssh/raspberry_pi_key
    ServerAliveInterval 60
    ServerAliveCountMax 3
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 600

重要配置说明

配置项 说明 作用
Host 设备昵称 使用 ssh raspberry-pi 连接
HostName 实际 IP 地址 真实连接目标
IdentityFile SSH 私钥路径 免密登录
ControlMaster 连接复用 提升 rsync 同步速度 3-5 倍
ControlPersist 保持连接 10 分钟内无需重连

4. 项目目录结构

复制代码
~/my-project/                              # 项目根目录
├── .remote-config.json                    # 项目配置(不同步到远程)
├── remote_toolkit.sh                      # 工具脚本(不同步)
├── CLAUDE.md                             # Claude 上下文(不同步)
├── README.md                             # 项目说明(不同步)
├── .gitignore                            # Git 忽略规则
├── .backup/                              # 自动备份目录(不同步)
│
├── src/                                  # 源代码(会同步)
│   ├── main.py
│   └── utils.py
├── tests/                                # 测试代码(会同步)
│   └── test_main.py
├── requirements.txt                      # 依赖列表(会同步)
└── config.yaml                          # 配置文件(会同步)
文件同步规则
文件类型 是否同步 原因
工具文件(CLAUDE.md、remote_toolkit.sh 等) ❌ 否 仅本地使用
版本控制(.git/) ❌ 否 远程不需要
依赖目录(node_modules/、venv/) ❌ 否 在远程重新安装
源代码、配置文件 ✅ 是 需要在远程运行

重要:工具文件不会同步到远程,保持远程目录干净。

5. 完整配置关系图

复制代码
┌─────────────────────────────────────────────────────────┐
│  工具目录: /Users/admin/bin/remote_execute_claude/      │
│  ├── devices/raspberry-pi.conf    (设备信息)            │
│  └── setup_ssh.sh → 配置 ~/.ssh/config                 │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  SSH 配置: ~/.ssh/config                                │
│  Host raspberry-pi                                      │
│    HostName 192.168.1.100                              │
│    IdentityFile ~/.ssh/raspberry_pi_key                │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  项目配置: ~/my-project/.remote-config.json             │
│  {                                                      │
│    "host": "raspberry-pi",   ← 引用 SSH 配置           │
│    "project_path": "/home/pi/my-project"               │
│  }                                                      │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  使用工具: ./remote_toolkit.sh                          │
│  读取 .remote-config.json → 通过 SSH 连接远程设备       │
└─────────────────────────────────────────────────────────┘

6. 常见配置场景

场景 1:添加自定义排除规则

编辑 .remote-config.json,在 exclude 数组中添加:

json 复制代码
{
  "exclude": [
    // ... 默认规则 ...
    "data/large_dataset.csv",    // 排除大数据文件
    "*.tmp",                      // 排除临时文件
    "build/",                     // 排除构建目录
    ".pytest_cache/"              // 排除测试缓存
  ]
}
场景 2:更改远程项目路径
bash 复制代码
# 方式 1: 编辑配置
vim .remote-config.json
# 修改 "project_path": "/new/path"

# 方式 2: 使用命令
jq '.project_path = "/home/pi/new-project"' .remote-config.json > .tmp
mv .tmp .remote-config.json

# 在远程创建新目录
./remote_toolkit.sh exec "mkdir -p /home/pi/new-project"

# 同步文件
./remote_toolkit.sh sync-to
场景 3:项目关联不同设备
bash 复制代码
# 假设已配置两个设备:raspberry-pi 和 jetson-nano

# 切换到 jetson-nano
jq '.host = "jetson-nano"' .remote-config.json > .tmp
mv .tmp .remote-config.json

# 需要同时更新远程路径和用户
jq '.user = "nvidia"' .remote-config.json > .tmp
mv .tmp .remote-config.json

# 验证配置
./remote_toolkit.sh status

❓ 常见问题

Q: 可以同时连接多个远程设备吗?

A : 可以。配置多个设备后,编辑 .remote-config.json 中的 host 字段即可切换。

Q: watch 模式会占用很多资源吗?

A: 不会。使用系统内核级文件监控 API(macOS FSEvents / Linux inotify),CPU 占用 < 1%,内存 < 10MB。

Q: 支持 Windows 吗?

A : 推荐使用 WSL2(完全支持)。Git Bash 可用但不支持 watch 模式。

Q: 能否加密传输?

A: 已经加密。rsync 通过 SSH 传输,SSH 本身提供加密,无需额外配置。

Q: 同步失败如何恢复?

A : sync-from 会自动备份到 .backup/ 目录。查看备份文件:ls .backup/


🎉 开始使用

bash 复制代码
# 一键开始
cd /Users/admin/bin/remote_execute_claude
./quickstart.sh

# 享受 AI 辅助的远程开发!

适用场景:树莓派、嵌入式系统、边缘设备、远程服务器开发

开发愉快! 🚀

工具文件源码

1. quickstart.sh

bas 复制代码
#!/bin/bash

# ============================================
# Remote Execute Claude - 快速开始向导
# ============================================

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'

clear

cat << "EOF"
  ____                      _         _____                     _
 |  _ \ ___ _ __ ___   ___ | |_ ___  | ____|_  _____  ___ _   _| |_ ___
 | |_) / _ \ '_ ` _ \ / _ \| __/ _ \ |  _| \ \/ / _ \/ __| | | | __/ _ \
 |  _ <  __/ | | | | | (_) | ||  __/ | |___ >  <  __/ (__| |_| | ||  __/
 |_| \_\___|_| |_| |_|\___/ \__\___| |_____/_/\_\___|\___|\__,_|\__\___|

   ____ _                 _
  / ___| | __ _ _   _  __| | ___
 | |   | |/ _` | | | |/ _` |/ _ \
 | |___| | (_| | |_| | (_| |  __/
  \____|_|\__,_|\__,_|\__,_|\___|

EOF

echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BOLD}${GREEN}Remote Execute Claude - 快速开始向导${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e "${CYAN}这个向导将帮助你快速配置远程开发环境。${NC}"
echo ""
echo -e "${YELLOW}需要完成的步骤:${NC}"
echo -e "  ${GREEN}1.${NC} 安装必要的环境工具"
echo -e "  ${GREEN}2.${NC} 配置 SSH 密钥和连接"
echo -e "  ${GREEN}3.${NC} 创建项目并初始化配置"
echo ""

read -p "$(echo -e ${YELLOW}准备开始?按任意键继续...${NC})" -n 1 -r
echo ""
echo ""

# ============================================
# 步骤 1: 环境安装
# ============================================

echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BOLD}${GREEN}步骤 1/3: 环境安装${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e "${CYAN}检查并安装必要的工具...${NC}"
echo ""

./setup_environment.sh

if [ $? -ne 0 ]; then
    echo ""
    echo -e "${RED}❌ 环境安装失败${NC}"
    echo -e "${YELLOW}请检查错误信息并重试${NC}"
    exit 1
fi

echo ""
read -p "$(echo -e ${YELLOW}步骤 1 完成!按任意键继续...${NC})" -n 1 -r
echo ""
echo ""

# ============================================
# 步骤 2: SSH 配置
# ============================================

echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BOLD}${GREEN}步骤 2/3: SSH 配置${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e "${CYAN}配置远程设备的 SSH 连接...${NC}"
echo ""

./setup_ssh.sh

if [ $? -ne 0 ]; then
    echo ""
    echo -e "${RED}❌ SSH 配置失败${NC}"
    echo -e "${YELLOW}请检查错误信息并重试${NC}"
    exit 1
fi

echo ""
read -p "$(echo -e ${YELLOW}步骤 2 完成!按任意键继续...${NC})" -n 1 -r
echo ""
echo ""

# ============================================
# 步骤 3: 项目创建
# ============================================

echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BOLD}${GREEN}步骤 3/3: 创建项目${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e "${CYAN}创建项目配置...${NC}"
echo ""

./create_project.sh

if [ $? -ne 0 ]; then
    echo ""
    echo -e "${RED}❌ 项目创建失败${NC}"
    echo -e "${YELLOW}请检查错误信息并重试${NC}"
    exit 1
fi

# ============================================
# 完成
# ============================================

clear

cat << "EOF"
  ____                            _            _
 / ___| _   _  ___ ___ ___  ___ | |_ ___  ___| |
 \___ \| | | |/ __/ __/ _ \/ __|| __/ _ \/ __| |
  ___) | |_| | (_| (_|  __/\__ \| ||  __/\__ \_|
 |____/ \__,_|\___\___\___||___/ \__\___||___(_)

EOF

echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BOLD}${GREEN}✅ 所有配置完成!${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e "${CYAN}🎉 恭喜!你已经完成了所有设置。${NC}"
echo ""
echo -e "${GREEN}接下来的步骤:${NC}"
echo ""
echo -e "${YELLOW}1. 进入项目目录${NC}"
echo -e "   ${CYAN}cd [你的项目目录]${NC}"
echo ""
echo -e "${YELLOW}2. 查看远程设备状态${NC}"
echo -e "   ${CYAN}./remote_toolkit.sh status${NC}"
echo ""
echo -e "${YELLOW}3. 开启自动同步模式(推荐)${NC}"
echo -e "   ${CYAN}./remote_toolkit.sh watch${NC}"
echo ""
echo -e "${YELLOW}4. 在新终端启动 Claude Code${NC}"
echo -e "   ${CYAN}claude${NC}"
echo ""
echo -e "${YELLOW}5. 告诉 Claude Code:${NC}"
echo -e "${CYAN}   \"我正在使用远程边缘设备开发。${NC}"
echo -e "${CYAN}    使用 ./remote_toolkit.sh 与远程设备交互。${NC}"
echo -e "${CYAN}    自动同步已启动。${NC}"
echo -e "${CYAN}    ${NC}"
echo -e "${CYAN}    可用命令:${NC}"
echo -e "${CYAN}    - ./remote_toolkit.sh exec [命令] - 远程执行${NC}"
echo -e "${CYAN}    - ./remote_toolkit.sh logs [文件] - 查看日志${NC}"
echo -e "${CYAN}    - ./remote_toolkit.sh read [文件] - 读取文件${NC}"
echo -e "${CYAN}    ${NC}"
echo -e "${CYAN}    当前任务:[描述你的任务]\"${NC}"
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e "${GREEN}📚 查看完整文档:${NC}"
echo -e "   ${CYAN}cat /Users/admin/bin/remote_execute_claude/README.md${NC}"
echo ""
echo -e "${GREEN}🆘 需要帮助?${NC}"
echo -e "   ${CYAN}./remote_toolkit.sh help${NC}"
echo ""
echo -e "${BOLD}${GREEN}祝你开发愉快!🚀${NC}"
echo ""

2. setup_environment.sh

bash 复制代码
#!/bin/bash

# ============================================
# Remote Execute Claude - 环境安装脚本
# ============================================

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}Remote Execute Claude - 环境安装${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

# 检测操作系统
detect_os() {
    if [[ "$OSTYPE" == "darwin"* ]]; then
        echo "macos"
    elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
        echo "linux"
    else
        echo "unknown"
    fi
}

OS=$(detect_os)
echo -e "${BLUE}📋 检测到操作系统: ${OS}${NC}"
echo ""

# 检查工具是否已安装
check_tool() {
    local tool=$1
    if command -v "$tool" &> /dev/null; then
        echo -e "${GREEN}✅ ${tool} 已安装 - $(${tool} --version 2>&1 | head -n 1)${NC}"
        return 0
    else
        echo -e "${YELLOW}⚠️  ${tool} 未安装${NC}"
        return 1
    fi
}

# 安装工具 - macOS
install_tool_macos() {
    local tool=$1
    echo -e "${BLUE}📦 正在安装 ${tool}...${NC}"

    # 检查 Homebrew
    if ! command -v brew &> /dev/null; then
        echo -e "${RED}❌ Homebrew 未安装!${NC}"
        echo -e "${YELLOW}请先安装 Homebrew: https://brew.sh${NC}"
        echo -e "${YELLOW}或运行: /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"${NC}"
        exit 1
    fi

    brew install "$tool"

    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✅ ${tool} 安装成功${NC}"
    else
        echo -e "${RED}❌ ${tool} 安装失败${NC}"
        exit 1
    fi
}

# 安装工具 - Linux
install_tool_linux() {
    local tool=$1
    local package=$2  # 某些工具的包名可能不同

    echo -e "${BLUE}📦 正在安装 ${tool}...${NC}"

    # 检测包管理器
    if command -v apt-get &> /dev/null; then
        sudo apt-get update
        sudo apt-get install -y "${package:-$tool}"
    elif command -v yum &> /dev/null; then
        sudo yum install -y "${package:-$tool}"
    else
        echo -e "${RED}❌ 未检测到支持的包管理器 (apt-get 或 yum)${NC}"
        exit 1
    fi

    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✅ ${tool} 安装成功${NC}"
    else
        echo -e "${RED}❌ ${tool} 安装失败${NC}"
        exit 1
    fi
}

# 检查并安装必需工具
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}第一步: 检查必需工具${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

TOOLS_TO_INSTALL=()

# 检查 rsync
if ! check_tool "rsync"; then
    TOOLS_TO_INSTALL+=("rsync")
fi
echo ""

# 检查 jq
if ! check_tool "jq"; then
    TOOLS_TO_INSTALL+=("jq")
fi
echo ""

# 检查文件监控工具
if [[ "$OS" == "macos" ]]; then
    if ! check_tool "fswatch"; then
        TOOLS_TO_INSTALL+=("fswatch")
    fi
elif [[ "$OS" == "linux" ]]; then
    if ! check_tool "inotifywait"; then
        TOOLS_TO_INSTALL+=("inotify-tools")
    fi
fi
echo ""

# 检查 ssh
if ! check_tool "ssh"; then
    echo -e "${RED}❌ SSH 未安装!这是必需的工具。${NC}"
    exit 1
fi
echo ""

# 安装缺失的工具
if [ ${#TOOLS_TO_INSTALL[@]} -eq 0 ]; then
    echo -e "${GREEN}🎉 所有必需工具已安装!${NC}"
else
    echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    echo -e "${YELLOW}第二步: 安装缺失工具${NC}"
    echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    echo ""
    echo -e "${YELLOW}需要安装: ${TOOLS_TO_INSTALL[*]}${NC}"
    echo ""

    read -p "是否继续安装?(y/n) " -n 1 -r
    echo ""

    if [[ $REPLY =~ ^[Yy]$ ]]; then
        for tool in "${TOOLS_TO_INSTALL[@]}"; do
            if [[ "$OS" == "macos" ]]; then
                install_tool_macos "$tool"
            elif [[ "$OS" == "linux" ]]; then
                # 特殊处理 inotifywait (包名是 inotify-tools)
                if [[ "$tool" == "inotify-tools" ]]; then
                    install_tool_linux "inotifywait" "inotify-tools"
                else
                    install_tool_linux "$tool"
                fi
            fi
            echo ""
        done
    else
        echo -e "${YELLOW}⚠️  安装已取消${NC}"
        exit 0
    fi
fi

# 验证安装
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}第三步: 验证安装${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

ALL_OK=true

# 验证必需工具
echo -e "${BLUE}验证必需工具...${NC}"
echo ""

for tool in rsync jq ssh; do
    if check_tool "$tool"; then
        echo ""
    else
        ALL_OK=false
    fi
done

# 验证文件监控工具
if [[ "$OS" == "macos" ]]; then
    if check_tool "fswatch"; then
        echo ""
    else
        ALL_OK=false
    fi
elif [[ "$OS" == "linux" ]]; then
    if check_tool "inotifywait"; then
        echo ""
    else
        ALL_OK=false
    fi
fi

# 创建 SSH sockets 目录
echo -e "${BLUE}创建 SSH sockets 目录...${NC}"
mkdir -p ~/.ssh/sockets
echo -e "${GREEN}✅ ~/.ssh/sockets 已创建${NC}"
echo ""

# 最终结果
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
if [ "$ALL_OK" = true ]; then
    echo -e "${GREEN}✅ 环境安装完成!${NC}"
    echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    echo ""
    echo -e "${GREEN}下一步操作:${NC}"
    echo -e "  1. 配置 SSH 密钥: ${YELLOW}./setup_ssh.sh${NC}"
    echo -e "  2. 创建项目配置: ${YELLOW}./create_project.sh${NC}"
    echo -e "  3. 开始使用工具: ${YELLOW}./remote_toolkit.sh${NC}"
    echo ""
    echo -e "${BLUE}工具目录: /Users/admin/bin/remote_execute_claude${NC}"
else
    echo -e "${RED}❌ 环境安装未完成,请检查错误信息${NC}"
    echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    exit 1
fi

3. setup_ssh.sh

bash 复制代码
#!/bin/bash

# ============================================
# Remote Execute Claude - SSH 配置脚本
# ============================================

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}Remote Execute Claude - SSH 配置${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

# 默认配置
SSH_KEY_NAME="edge_device_key"
SSH_KEY_PATH="$HOME/.ssh/${SSH_KEY_NAME}"
SSH_CONFIG_FILE="$HOME/.ssh/config"

# 获取用户输入
echo -e "${YELLOW}请输入远程设备信息:${NC}"
echo ""

# 读取设备昵称
read -p "设备昵称 (例如: edge-device): " DEVICE_NAME
if [ -z "$DEVICE_NAME" ]; then
    echo -e "${RED}❌ 设备昵称不能为空${NC}"
    exit 1
fi

# 读取 IP 地址
read -p "设备 IP 地址: " DEVICE_IP
if [ -z "$DEVICE_IP" ]; then
    echo -e "${RED}❌ IP 地址不能为空${NC}"
    exit 1
fi

# 读取用户名
read -p "SSH 用户名: " DEVICE_USER
if [ -z "$DEVICE_USER" ]; then
    echo -e "${RED}❌ 用户名不能为空${NC}"
    exit 1
fi

# 读取端口(默认 22)
read -p "SSH 端口 (默认 22): " DEVICE_PORT
DEVICE_PORT=${DEVICE_PORT:-22}

echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}配置信息确认${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "设备昵称: ${GREEN}${DEVICE_NAME}${NC}"
echo -e "IP 地址:  ${GREEN}${DEVICE_IP}${NC}"
echo -e "用户名:   ${GREEN}${DEVICE_USER}${NC}"
echo -e "端口:     ${GREEN}${DEVICE_PORT}${NC}"
echo -e "SSH 密钥: ${GREEN}${SSH_KEY_PATH}${NC}"
echo ""

read -p "确认以上信息正确?(y/n) " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo -e "${YELLOW}⚠️  配置已取消${NC}"
    exit 0
fi

# 创建 SSH 目录
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}第一步: 准备 SSH 环境${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

mkdir -p ~/.ssh
chmod 700 ~/.ssh
mkdir -p ~/.ssh/sockets
echo -e "${GREEN}✅ SSH 目录已准备${NC}"

# 检查是否已存在密钥
if [ -f "$SSH_KEY_PATH" ]; then
    echo ""
    echo -e "${YELLOW}⚠️  SSH 密钥已存在: ${SSH_KEY_PATH}${NC}"
    read -p "是否重新生成?这会覆盖现有密钥 (y/n) " -n 1 -r
    echo ""
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo -e "${BLUE}使用现有密钥${NC}"
        SKIP_KEYGEN=true
    else
        rm -f "${SSH_KEY_PATH}" "${SSH_KEY_PATH}.pub"
        SKIP_KEYGEN=false
    fi
else
    SKIP_KEYGEN=false
fi

# 生成 SSH 密钥
if [ "$SKIP_KEYGEN" = false ]; then
    echo ""
    echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    echo -e "${GREEN}第二步: 生成 SSH 密钥${NC}"
    echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    echo ""

    ssh-keygen -t ed25519 -f "$SSH_KEY_PATH" -C "edge-device-access" -N ""

    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✅ SSH 密钥生成成功${NC}"
    else
        echo -e "${RED}❌ SSH 密钥生成失败${NC}"
        exit 1
    fi
fi

# 复制公钥到远程设备
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}第三步: 复制公钥到远程设备${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

echo -e "${YELLOW}请输入远程设备的 SSH 密码(只需要这一次)${NC}"
ssh-copy-id -i "${SSH_KEY_PATH}.pub" -p ${DEVICE_PORT} ${DEVICE_USER}@${DEVICE_IP}

if [ $? -eq 0 ]; then
    echo -e "${GREEN}✅ 公钥复制成功${NC}"
else
    echo -e "${RED}❌ 公钥复制失败${NC}"
    echo -e "${YELLOW}请检查:${NC}"
    echo -e "  1. 远程设备 IP 地址是否正确"
    echo -e "  2. 用户名是否正确"
    echo -e "  3. 端口是否正确"
    echo -e "  4. 远程设备是否允许 SSH 连接"
    exit 1
fi

# 测试连接
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}第四步: 测试 SSH 连接${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

echo -e "${BLUE}测试无密码登录...${NC}"
ssh -i "$SSH_KEY_PATH" -p ${DEVICE_PORT} ${DEVICE_USER}@${DEVICE_IP} "echo '连接成功!'"

if [ $? -eq 0 ]; then
    echo -e "${GREEN}✅ SSH 连接测试成功${NC}"
else
    echo -e "${RED}❌ SSH 连接测试失败${NC}"
    exit 1
fi

# 配置 SSH config
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}第五步: 配置 SSH config${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

# 检查是否已存在配置
if grep -q "Host ${DEVICE_NAME}" "$SSH_CONFIG_FILE" 2>/dev/null; then
    echo -e "${YELLOW}⚠️  SSH config 中已存在 ${DEVICE_NAME} 配置${NC}"
    read -p "是否覆盖?(y/n) " -n 1 -r
    echo ""
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        # 删除旧配置
        sed -i.bak "/Host ${DEVICE_NAME}/,/^$/d" "$SSH_CONFIG_FILE"
        echo -e "${YELLOW}已删除旧配置${NC}"
    else
        echo -e "${BLUE}保留现有配置${NC}"
        SKIP_SSH_CONFIG=true
    fi
else
    SKIP_SSH_CONFIG=false
fi

if [ "$SKIP_SSH_CONFIG" = false ]; then
    # 添加新配置
    cat >> "$SSH_CONFIG_FILE" <<EOF

Host ${DEVICE_NAME}
    HostName ${DEVICE_IP}
    User ${DEVICE_USER}
    Port ${DEVICE_PORT}
    IdentityFile ${SSH_KEY_PATH}
    ServerAliveInterval 60
    ServerAliveCountMax 3
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 600

EOF

    echo -e "${GREEN}✅ SSH config 配置完成${NC}"
fi

# 测试简化连接
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}第六步: 测试简化连接${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

echo -e "${BLUE}现在可以使用简化命令连接:${NC}"
echo -e "${YELLOW}ssh ${DEVICE_NAME}${NC}"
echo ""
echo -e "${BLUE}测试中...${NC}"
ssh ${DEVICE_NAME} "echo '简化连接成功!'"

if [ $? -eq 0 ]; then
    echo -e "${GREEN}✅ 简化连接测试成功${NC}"
else
    echo -e "${RED}❌ 简化连接测试失败${NC}"
    exit 1
fi

# 保存配置到文件
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}第七步: 保存设备配置${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

DEVICE_CONFIG_FILE="/Users/admin/bin/remote_execute_claude/devices/${DEVICE_NAME}.conf"
mkdir -p "/Users/admin/bin/remote_execute_claude/devices"

cat > "$DEVICE_CONFIG_FILE" <<EOF
# 远程设备配置 - ${DEVICE_NAME}
# 生成时间: $(date)

DEVICE_NAME="${DEVICE_NAME}"
DEVICE_IP="${DEVICE_IP}"
DEVICE_USER="${DEVICE_USER}"
DEVICE_PORT="${DEVICE_PORT}"
SSH_KEY_PATH="${SSH_KEY_PATH}"
EOF

echo -e "${GREEN}✅ 设备配置已保存到: ${DEVICE_CONFIG_FILE}${NC}"

# 完成
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}✅ SSH 配置完成!${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e "${GREEN}配置摘要:${NC}"
echo -e "  设备昵称: ${YELLOW}${DEVICE_NAME}${NC}"
echo -e "  连接地址: ${YELLOW}${DEVICE_USER}@${DEVICE_IP}:${DEVICE_PORT}${NC}"
echo -e "  简化命令: ${YELLOW}ssh ${DEVICE_NAME}${NC}"
echo -e "  配置文件: ${YELLOW}${DEVICE_CONFIG_FILE}${NC}"
echo ""
echo -e "${GREEN}下一步:${NC}"
echo -e "  创建项目配置: ${YELLOW}./create_project.sh${NC}"
echo ""

4. create_project.sh

bash 复制代码
#!/bin/bash

# ============================================
# Remote Execute Claude - 项目配置脚本
# ============================================

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}Remote Execute Claude - 项目配置${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

TOOLKIT_DIR="/Users/admin/bin/remote_execute_claude"

# 检查是否有已配置的设备
DEVICES_DIR="${TOOLKIT_DIR}/devices"
if [ ! -d "$DEVICES_DIR" ] || [ -z "$(ls -A $DEVICES_DIR 2>/dev/null)" ]; then
    echo -e "${RED}❌ 未找到已配置的设备${NC}"
    echo -e "${YELLOW}请先运行: ./setup_ssh.sh 配置远程设备${NC}"
    exit 1
fi

# 列出可用设备
echo -e "${BLUE}可用的远程设备:${NC}"
echo ""
device_count=0
declare -a device_names
declare -a device_files

for conf_file in "$DEVICES_DIR"/*.conf; do
    if [ -f "$conf_file" ]; then
        device_count=$((device_count + 1))
        source "$conf_file"
        device_names+=("$DEVICE_NAME")
        device_files+=("$conf_file")
        echo -e "  ${GREEN}[$device_count]${NC} ${DEVICE_NAME} (${DEVICE_USER}@${DEVICE_IP})"
    fi
done

echo ""

# 选择设备
if [ $device_count -eq 1 ]; then
    SELECTED_INDEX=0
    echo -e "${BLUE}自动选择设备: ${device_names[0]}${NC}"
else
    read -p "请选择设备 [1-${device_count}]: " selection
    SELECTED_INDEX=$((selection - 1))

    if [ $SELECTED_INDEX -lt 0 ] || [ $SELECTED_INDEX -ge $device_count ]; then
        echo -e "${RED}❌ 无效的选择${NC}"
        exit 1
    fi
fi

# 加载选中的设备配置
source "${device_files[$SELECTED_INDEX]}"
echo -e "${GREEN}✅ 已选择设备: ${DEVICE_NAME}${NC}"
echo ""

# 获取项目信息
echo -e "${YELLOW}请输入项目信息:${NC}"
echo ""

# 项目目录
read -p "本地项目目录 (例如: ~/my_edge_project): " PROJECT_DIR
PROJECT_DIR="${PROJECT_DIR/#\~/$HOME}"  # 展开 ~ 符号

if [ -z "$PROJECT_DIR" ]; then
    echo -e "${RED}❌ 项目目录不能为空${NC}"
    exit 1
fi

# 创建目录(如果不存在)
if [ ! -d "$PROJECT_DIR" ]; then
    read -p "目录不存在,是否创建?(y/n) " -n 1 -r
    echo ""
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        mkdir -p "$PROJECT_DIR"
        echo -e "${GREEN}✅ 已创建目录: ${PROJECT_DIR}${NC}"
    else
        echo -e "${RED}❌ 项目目录不存在${NC}"
        exit 1
    fi
fi

# 远程项目路径
read -p "远程项目路径 (例如: /home/user/project): " REMOTE_PATH
if [ -z "$REMOTE_PATH" ]; then
    echo -e "${RED}❌ 远程路径不能为空${NC}"
    exit 1
fi

# 询问是否在远程创建目录
echo ""
read -p "是否在远程设备上创建项目目录?(y/n) " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]]; then
    echo -e "${BLUE}在远程设备上创建目录: ${REMOTE_PATH}${NC}"
    ssh ${DEVICE_NAME} "mkdir -p ${REMOTE_PATH}"
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✅ 远程目录创建成功${NC}"
    else
        echo -e "${RED}❌ 远程目录创建失败${NC}"
        exit 1
    fi
fi

# 配置排除项
echo ""
echo -e "${YELLOW}配置同步排除项(多个用空格分隔,按回车跳过使用默认值)${NC}"
echo -e "${BLUE}默认排除: node_modules __pycache__ .git venv *.pyc *.log .DS_Store${NC}"
echo -e "${BLUE}          CLAUDE.md README.md remote_toolkit.sh (本地工具文件)${NC}"
read -p "自定义排除项: " CUSTOM_EXCLUDES

# 合并排除项(包含本地工具文件)
DEFAULT_EXCLUDES=("node_modules" "__pycache__" ".git" "venv" "*.pyc" "*.log" ".DS_Store" "*.swp" "CLAUDE.md" "README.md" "remote_toolkit.sh" ".remote-config.json" ".backup")
if [ -n "$CUSTOM_EXCLUDES" ]; then
    IFS=' ' read -ra ADDITIONAL_EXCLUDES <<< "$CUSTOM_EXCLUDES"
    EXCLUDE_ARRAY=("${DEFAULT_EXCLUDES[@]}" "${ADDITIONAL_EXCLUDES[@]}")
else
    EXCLUDE_ARRAY=("${DEFAULT_EXCLUDES[@]}")
fi

# 确认信息
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}项目配置信息确认${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "远程设备:   ${GREEN}${DEVICE_NAME}${NC}"
echo -e "本地目录:   ${GREEN}${PROJECT_DIR}${NC}"
echo -e "远程路径:   ${GREEN}${REMOTE_PATH}${NC}"
echo -e "排除项:     ${GREEN}${EXCLUDE_ARRAY[*]}${NC}"
echo ""

read -p "确认以上信息正确?(y/n) " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo -e "${YELLOW}⚠️  配置已取消${NC}"
    exit 0
fi

# 创建配置文件
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}创建项目配置文件${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

CONFIG_FILE="${PROJECT_DIR}/.remote-config.json"

# 生成 JSON 格式的排除项数组
EXCLUDE_JSON="["
for i in "${!EXCLUDE_ARRAY[@]}"; do
    if [ $i -gt 0 ]; then
        EXCLUDE_JSON+=","
    fi
    EXCLUDE_JSON+="\"${EXCLUDE_ARRAY[$i]}\""
done
EXCLUDE_JSON+="]"

# 创建配置文件
cat > "$CONFIG_FILE" <<EOF
{
  "host": "${DEVICE_NAME}",
  "user": "${DEVICE_USER}",
  "port": ${DEVICE_PORT},
  "project_path": "${REMOTE_PATH}",
  "exclude": ${EXCLUDE_JSON}
}
EOF

echo -e "${GREEN}✅ 配置文件已创建: ${CONFIG_FILE}${NC}"

# 复制工具脚本到项目目录
echo ""
echo -e "${BLUE}复制工具脚本到项目目录...${NC}"
cp "${TOOLKIT_DIR}/remote_toolkit.sh" "${PROJECT_DIR}/"
chmod +x "${PROJECT_DIR}/remote_toolkit.sh"
echo -e "${GREEN}✅ 工具脚本已复制${NC}"

# 创建 .gitignore
echo ""
echo -e "${BLUE}创建 .gitignore...${NC}"
GITIGNORE_FILE="${PROJECT_DIR}/.gitignore"

if [ -f "$GITIGNORE_FILE" ]; then
    echo -e "${YELLOW}⚠️  .gitignore 已存在${NC}"
else
    cat > "$GITIGNORE_FILE" <<EOF
# Remote Execute Claude
.remote-config.json
.backup/
.backup.old/

# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
venv/
ENV/
env/

# Node
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# IDE
.vscode/
.idea/
*.swp
*.swo
*~

# OS
.DS_Store
Thumbs.db

# Logs
*.log
logs/
EOF
    echo -e "${GREEN}✅ .gitignore 已创建${NC}"
fi

# 创建 README
echo ""
echo -e "${BLUE}创建项目 README...${NC}"
README_FILE="${PROJECT_DIR}/README.md"

if [ -f "$README_FILE" ]; then
    echo -e "${YELLOW}⚠️  README.md 已存在,跳过${NC}"
else
    cat > "$README_FILE" <<EOF
# Remote Edge Device Project

该项目使用 Remote Execute Claude 工具进行远程开发和调试。

## 远程设备信息

- **设备名称**: ${DEVICE_NAME}
- **远程路径**: ${REMOTE_PATH}

## 使用方法

### 查看状态
\`\`\`bash
./remote_toolkit.sh status
\`\`\`

### 同步到远程
\`\`\`bash
./remote_toolkit.sh sync-to
\`\`\`

### 从远程同步
\`\`\`bash
./remote_toolkit.sh sync-from
\`\`\`

### 自动监控并同步
\`\`\`bash
./remote_toolkit.sh watch
\`\`\`

### 远程执行命令
\`\`\`bash
./remote_toolkit.sh exec "python main.py"
\`\`\`

### 读取远程文件
\`\`\`bash
./remote_toolkit.sh read "config.yaml"
\`\`\`

### 查看远程日志
\`\`\`bash
./remote_toolkit.sh logs "app.log"
\`\`\`

### 打开远程 Shell
\`\`\`bash
./remote_toolkit.sh shell
\`\`\`

## Claude Code 集成

在 Claude Code 中使用时,告诉 AI:

\`\`\`
我正在使用远程边缘设备进行开发。

配置信息在 .remote-config.json 中。
使用 ./remote_toolkit.sh 工具与远程设备交互。

可用命令:
- ./remote_toolkit.sh exec [命令] - 远程执行
- ./remote_toolkit.sh sync-to - 同步到远程
- ./remote_toolkit.sh watch - 自动同步(开发时使用)

当前任务:[描述你的任务]
\`\`\`

## 配置文件

配置文件位于 \`.remote-config.json\`,包含:
- 远程设备连接信息
- 同步排除项

**注意**: 该文件已添加到 .gitignore,不会被提交到版本控制。
EOF
    echo -e "${GREEN}✅ README.md 已创建${NC}"
fi

# 创建 CLAUDE.md
echo ""
echo -e "${BLUE}创建 CLAUDE.md(Claude Code 自动识别)...${NC}"
CLAUDE_FILE="${PROJECT_DIR}/CLAUDE.md"

if [ -f "$CLAUDE_FILE" ]; then
    echo -e "${YELLOW}⚠️  CLAUDE.md 已存在,跳过${NC}"
else
    # 读取模板并替换变量
    TEMPLATE_FILE="${TOOLKIT_DIR}/templates/CLAUDE.md.template"

    if [ -f "$TEMPLATE_FILE" ]; then
        # 使用 sed 替换模板中的变量
        sed -e "s|{{DEVICE_NAME}}|${DEVICE_NAME}|g" \
            -e "s|{{REMOTE_PATH}}|${REMOTE_PATH}|g" \
            "$TEMPLATE_FILE" > "$CLAUDE_FILE"
        echo -e "${GREEN}✅ CLAUDE.md 已创建${NC}"
        echo -e "${CYAN}   Claude Code 会自动读取此文件了解项目背景${NC}"
    else
        # 如果模板不存在,使用内联版本
        cat > "$CLAUDE_FILE" <<'CLAUDEEOF'
# 项目背景:远程边缘设备开发

## 🎯 核心信息

本项目运行在**远程边缘设备**上,本地环境不具备运行条件。

**重要**:
- 本地只用于代码编辑
- 所有执行、测试都在远程设备上进行
- 文件修改会自动同步到远程设备(如果 watch 模式启动)

## 📡 远程设备配置

CLAUDEEOF

        # 追加设备信息
        cat >> "$CLAUDE_FILE" <<EOF
- **设备名称**: ${DEVICE_NAME}
- **远程路径**: ${REMOTE_PATH}
- **连接方式**: SSH (配置已完成)
- **同步状态**: 自动同步(watch 模式)或手动同步

配置文件位于: \`.remote-config.json\`

## 🛠️ 可用工具

### 核心命令:remote_toolkit.sh

所有与远程设备的交互都通过 \`./remote_toolkit.sh\` 进行:

\`\`\`bash
# 基本操作
./remote_toolkit.sh status        # 查看远程设备状态
./remote_toolkit.sh sync-to       # 同步到远程
./remote_toolkit.sh sync-from     # 从远程同步
./remote_toolkit.sh watch         # 自动监控并同步

# 远程执行
./remote_toolkit.sh exec "命令"    # 在远程设备上执行命令
./remote_toolkit.sh read "文件"    # 读取远程文件
./remote_toolkit.sh logs "日志"    # 查看远程日志
./remote_toolkit.sh shell         # 打开远程终端
\`\`\`

## 📋 标准工作流程

1. **本地编辑**: 使用 Read、Write、Edit 工具正常编辑文件
2. **自动同步**: 如果 watch 模式运行中,修改会自动同步
3. **远程执行**: 使用 \`exec\` 命令在远程设备上运行和测试
4. **查看结果**: 使用 \`logs\` 或 \`read\` 查看输出和日志

## 💡 最佳实践

### ✅ 应该做的

1. **使用本地工具编辑文件** - 使用 Read、Write、Edit 工具修改代码
2. **远程执行所有运行命令** - \`./remote_toolkit.sh exec "python main.py"\`
3. **使用 read 查看远程文件** - \`./remote_toolkit.sh read "config.yaml"\`

### ❌ 不应该做的

1. **不要在本地执行项目代码** - 本地环境不支持
2. **不要假设本地环境可用** - 所有测试和运行都在远程进行
3. **不要直接在远程修改文件** - 应该在本地修改后同步

## 🔧 常见任务示例

\`\`\`bash
# Python 项目
./remote_toolkit.sh exec "pip install -r requirements.txt"
./remote_toolkit.sh exec "python main.py"
./remote_toolkit.sh exec "pytest tests/ -v"

# Node.js 项目
./remote_toolkit.sh exec "npm install"
./remote_toolkit.sh exec "npm start"
./remote_toolkit.sh exec "npm test"

# 查看日志
./remote_toolkit.sh logs "app.log"

# 读取配置
./remote_toolkit.sh read "config.yaml"
\`\`\`

## 🚨 重要提醒

1. **文件会自动同步**: 在 watch 模式下,本地文件修改后会自动同步到远程
2. **执行在远程**: 所有代码执行、测试都在远程设备上进行
3. **日志在远程**: 程序输出的日志文件在远程设备上

---

**记住**: 本地是编辑环境,远程是运行环境。保持这个清晰的分离!
EOF
        echo -e "${GREEN}✅ CLAUDE.md 已创建${NC}"
        echo -e "${CYAN}   Claude Code 会自动读取此文件了解项目背景${NC}"
    fi
fi

# 初始化 git(如果需要)
echo ""
read -p "是否初始化 Git 仓库?(y/n) " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]]; then
    cd "$PROJECT_DIR"
    if [ -d ".git" ]; then
        echo -e "${YELLOW}⚠️  Git 仓库已存在${NC}"
    else
        git init
        echo -e "${GREEN}✅ Git 仓库已初始化${NC}"
    fi
fi

# 测试连接
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}测试远程连接${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

cd "$PROJECT_DIR"
./remote_toolkit.sh status

# 完成
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}✅ 项目配置完成!${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e "${GREEN}项目目录:${NC} ${YELLOW}${PROJECT_DIR}${NC}"
echo ""
echo -e "${GREEN}快速开始:${NC}"
echo -e "  1. 进入项目目录: ${YELLOW}cd ${PROJECT_DIR}${NC}"
echo -e "  2. 查看状态:     ${YELLOW}./remote_toolkit.sh status${NC}"
echo -e "  3. 开启自动同步: ${YELLOW}./remote_toolkit.sh watch${NC}"
echo -e "  4. 启动 Claude:  ${YELLOW}claude${NC}"
echo ""
echo -e "${BLUE}详细使用说明请查看: ${PROJECT_DIR}/README.md${NC}"
echo ""

5. remote_toolkit.sh

bash 复制代码
#!/bin/bash

# ============================================
# Remote Execute Claude - 主工具脚本
# ============================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'

# 配置文件
CONFIG_FILE=".remote-config.json"

# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
  echo -e "${RED}❌ 错误: $CONFIG_FILE 未找到${NC}"
  echo -e "${YELLOW}请先运行项目配置脚本创建配置文件${NC}"
  echo -e "${BLUE}提示: /Users/admin/bin/remote_execute_claude/create_project.sh${NC}"
  exit 1
fi

# 检查 jq 是否安装
if ! command -v jq &> /dev/null; then
  echo -e "${RED}❌ 错误: jq 未安装${NC}"
  echo -e "${YELLOW}请先运行环境安装脚本${NC}"
  echo -e "${BLUE}提示: /Users/admin/bin/remote_execute_claude/setup_environment.sh${NC}"
  exit 1
fi

# 解析配置
REMOTE_HOST=$(jq -r '.host' $CONFIG_FILE)
REMOTE_USER=$(jq -r '.user' $CONFIG_FILE)
REMOTE_PORT=$(jq -r '.port' $CONFIG_FILE)
REMOTE_PATH=$(jq -r '.project_path' $CONFIG_FILE)

# 构建排除参数
EXCLUDE_ARGS=""
while IFS= read -r exclude; do
  EXCLUDE_ARGS="$EXCLUDE_ARGS --exclude=$exclude"
done < <(jq -r '.exclude[]' $CONFIG_FILE)

# 函数: 检查远程连接
check_connection() {
  if ssh -p $REMOTE_PORT -o ConnectTimeout=5 ${REMOTE_USER}@${REMOTE_HOST} "exit" 2>/dev/null; then
    return 0
  else
    return 1
  fi
}

# 函数: 同步到远程
sync_to_remote() {
  echo -e "${BLUE}📤 同步 本地 → 远程...${NC}"
  echo ""

  rsync -avz --progress \
    -e "ssh -p $REMOTE_PORT" \
    $EXCLUDE_ARGS \
    --delete \
    ./ ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/

  local exit_code=$?
  echo ""
  if [ $exit_code -eq 0 ]; then
    echo -e "${GREEN}✅ 同步完成 (本地 → 远程)${NC}"
    echo -e "${CYAN}时间: $(date '+%Y-%m-%d %H:%M:%S')${NC}"
  else
    echo -e "${RED}❌ 同步失败${NC}"
    return 1
  fi
}

# 函数: 从远程同步
sync_from_remote() {
  echo -e "${BLUE}📥 同步 远程 → 本地...${NC}"
  echo ""

  # 创建备份
  echo -e "${YELLOW}💾 创建本地备份...${NC}"
  if [ -d ".backup" ]; then
    rm -rf .backup.old 2>/dev/null
    mv .backup .backup.old 2>/dev/null
  fi
  mkdir -p .backup
  rsync -a ./ .backup/ $EXCLUDE_ARGS 2>/dev/null
  echo -e "${GREEN}✅ 备份已创建: .backup/${NC}"
  echo ""

  rsync -avz --progress \
    -e "ssh -p $REMOTE_PORT" \
    $EXCLUDE_ARGS \
    ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/ ./

  local exit_code=$?
  echo ""
  if [ $exit_code -eq 0 ]; then
    echo -e "${GREEN}✅ 同步完成 (远程 → 本地)${NC}"
    echo -e "${YELLOW}💾 备份位置: .backup/${NC}"
    echo -e "${CYAN}时间: $(date '+%Y-%m-%d %H:%M:%S')${NC}"
  else
    echo -e "${RED}❌ 同步失败${NC}"
    return 1
  fi
}

# 函数: 执行远程命令
remote_exec() {
  local cmd="$@"
  echo -e "${BLUE}🚀 远程执行: ${CYAN}${cmd}${NC}"
  echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"

  ssh -p $REMOTE_PORT ${REMOTE_USER}@${REMOTE_HOST} \
    "cd ${REMOTE_PATH} && $cmd"

  local exit_code=$?
  echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"

  if [ $exit_code -eq 0 ]; then
    echo -e "${GREEN}✅ 命令执行成功 (退出码: 0)${NC}"
  else
    echo -e "${RED}❌ 命令执行失败 (退出码: ${exit_code})${NC}"
  fi

  return $exit_code
}

# 函数: 读取远程文件
remote_read() {
  local file_path="$1"

  if [ -z "$file_path" ]; then
    echo -e "${RED}❌ 错误: 请指定文件路径${NC}"
    echo -e "${YELLOW}用法: $0 read <文件路径>${NC}"
    return 1
  fi

  echo -e "${BLUE}📄 读取远程文件: ${CYAN}${file_path}${NC}"
  echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"

  ssh -p $REMOTE_PORT ${REMOTE_USER}@${REMOTE_HOST} \
    "cat ${REMOTE_PATH}/${file_path}"

  local exit_code=$?
  echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"

  if [ $exit_code -ne 0 ]; then
    echo -e "${RED}❌ 读取文件失败${NC}"
    return 1
  fi
}

# 函数: 监控文件变化并自动同步 (Linux)
watch_sync_linux() {
  echo -e "${GREEN}👁️  监控文件变化 (Linux inotify 模式)${NC}"
  echo -e "${YELLOW}按 Ctrl+C 停止监控${NC}"
  echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
  echo ""

  # 初始同步
  echo -e "${BLUE}执行初始同步...${NC}"
  sync_to_remote
  echo ""

  echo -e "${GREEN}⏳ 等待文件变化...${NC}"
  echo ""

  while inotifywait -r -e modify,create,delete,move \
    --exclude '(\.git|\.backup|node_modules|__pycache__|\.pyc$|\.log$)' \
    . 2>/dev/null; do

    echo ""
    echo -e "${YELLOW}📝 检测到文件变化${NC}"
    sync_to_remote
    echo ""
    echo -e "${GREEN}⏳ 等待下一次变化...${NC}"
    echo ""
  done
}

# 函数: 监控文件变化并自动同步 (macOS)
watch_sync_macos() {
  echo -e "${GREEN}👁️  监控文件变化 (macOS fswatch 模式)${NC}"
  echo -e "${YELLOW}按 Ctrl+C 停止监控${NC}"
  echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
  echo ""

  # 初始同步
  echo -e "${BLUE}执行初始同步...${NC}"
  sync_to_remote
  echo ""

  echo -e "${GREEN}⏳ 等待文件变化...${NC}"
  echo ""

  fswatch -o \
    --exclude='\.git/' \
    --exclude='\.backup/' \
    --exclude='node_modules/' \
    --exclude='__pycache__/' \
    --exclude='\.pyc$' \
    --exclude='\.log$' \
    . | while read f; do

    echo ""
    echo -e "${YELLOW}📝 检测到文件变化${NC}"
    sync_to_remote
    echo ""
    echo -e "${GREEN}⏳ 等待下一次变化...${NC}"
    echo ""
  done
}

# 函数: 监控包装器
watch_sync() {
  if command -v fswatch &> /dev/null; then
    watch_sync_macos
  elif command -v inotifywait &> /dev/null; then
    watch_sync_linux
  else
    echo -e "${RED}❌ 未找到文件监控工具${NC}"
    echo -e "${YELLOW}macOS: brew install fswatch${NC}"
    echo -e "${YELLOW}Linux: apt-get install inotify-tools${NC}"
    exit 1
  fi
}

# 函数: 查看远程日志
remote_logs() {
  local log_pattern="${1:-*.log}"

  echo -e "${BLUE}📋 查看远程日志: ${CYAN}${log_pattern}${NC}"
  echo -e "${YELLOW}按 Ctrl+C 停止${NC}"
  echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"

  ssh -p $REMOTE_PORT ${REMOTE_USER}@${REMOTE_HOST} \
    "tail -f ${REMOTE_PATH}/${log_pattern}"
}

# 函数: 打开远程 Shell
remote_shell() {
  echo -e "${BLUE}🖥️  打开远程 Shell${NC}"
  echo -e "${CYAN}工作目录: ${REMOTE_PATH}${NC}"
  echo -e "${YELLOW}输入 'exit' 或按 Ctrl+D 退出${NC}"
  echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
  echo ""

  ssh -p $REMOTE_PORT -t ${REMOTE_USER}@${REMOTE_HOST} \
    "cd ${REMOTE_PATH} && exec \$SHELL -l"
}

# 函数: 显示状态
show_status() {
  echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
  echo -e "${GREEN}Remote Execute Claude - 状态${NC}"
  echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
  echo ""

  # 基本信息
  echo -e "${CYAN}配置信息:${NC}"
  echo -e "  设备:     ${GREEN}${REMOTE_HOST}${NC}"
  echo -e "  用户:     ${GREEN}${REMOTE_USER}${NC}"
  echo -e "  端口:     ${GREEN}${REMOTE_PORT}${NC}"
  echo -e "  远程路径: ${GREEN}${REMOTE_PATH}${NC}"
  echo ""

  # 检查连接
  echo -e "${CYAN}连接状态:${NC}"
  if check_connection; then
    echo -e "  ${GREEN}✅ 连接正常${NC}"

    # 获取远程信息
    echo ""
    echo -e "${CYAN}远程设备信息:${NC}"

    # 操作系统
    OS_INFO=$(ssh -p $REMOTE_PORT ${REMOTE_USER}@${REMOTE_HOST} \
      "uname -s 2>/dev/null || echo 'Unknown'")
    echo -e "  操作系统: ${GREEN}${OS_INFO}${NC}"

    # 磁盘使用
    DISK_INFO=$(ssh -p $REMOTE_PORT ${REMOTE_USER}@${REMOTE_HOST} \
      "df -h ${REMOTE_PATH} 2>/dev/null | tail -1 | awk '{print \$5 \" used, \" \$4 \" free\"}' || echo 'N/A'")
    echo -e "  磁盘使用: ${GREEN}${DISK_INFO}${NC}"

    # 项目目录大小
    REMOTE_SIZE=$(ssh -p $REMOTE_PORT ${REMOTE_USER}@${REMOTE_HOST} \
      "du -sh ${REMOTE_PATH} 2>/dev/null | awk '{print \$1}' || echo 'N/A'")
    echo -e "  项目大小: ${GREEN}${REMOTE_SIZE}${NC}"

  else
    echo -e "  ${RED}❌ 无法连接${NC}"
    echo ""
    echo -e "${YELLOW}请检查:${NC}"
    echo -e "  1. 远程设备是否在线"
    echo -e "  2. SSH 服务是否运行"
    echo -e "  3. 网络连接是否正常"
    echo ""
    echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    return 1
  fi

  echo ""
  echo -e "${CYAN}本地项目:${NC}"
  LOCAL_FILES=$(find . -type f $EXCLUDE_ARGS 2>/dev/null | wc -l | xargs)
  LOCAL_SIZE=$(du -sh . 2>/dev/null | awk '{print $1}')
  echo -e "  文件数量: ${GREEN}${LOCAL_FILES}${NC}"
  echo -e "  项目大小: ${GREEN}${LOCAL_SIZE}${NC}"

  echo ""
  echo -e "${CYAN}远程项目:${NC}"
  REMOTE_FILES=$(ssh -p $REMOTE_PORT ${REMOTE_USER}@${REMOTE_HOST} \
    "cd ${REMOTE_PATH} && find . -type f 2>/dev/null | wc -l" | xargs)
  echo -e "  文件数量: ${GREEN}${REMOTE_FILES}${NC}"
  echo -e "  项目大小: ${GREEN}${REMOTE_SIZE}${NC}"

  echo ""
  echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}

# 函数: 设置远程目录
setup_remote() {
  echo -e "${BLUE}🔧 设置远程项目目录${NC}"
  echo ""

  echo -e "${YELLOW}在远程设备上创建目录: ${REMOTE_PATH}${NC}"
  ssh -p $REMOTE_PORT ${REMOTE_USER}@${REMOTE_HOST} \
    "mkdir -p ${REMOTE_PATH}"

  if [ $? -eq 0 ]; then
    echo -e "${GREEN}✅ 远程目录创建成功${NC}"
  else
    echo -e "${RED}❌ 远程目录创建失败${NC}"
    return 1
  fi
}

# 函数: 显示帮助
show_help() {
  cat <<EOF
${GREEN}Remote Execute Claude - 远程开发工具${NC}

${BLUE}用法:${NC}
  $0 <命令> [选项]

${BLUE}命令:${NC}
  ${GREEN}status${NC}           显示连接和同步状态
  ${GREEN}setup${NC}            在远程设备上创建项目目录
  ${GREEN}sync-to${NC}          同步本地文件到远程设备
  ${GREEN}sync-from${NC}        从远程设备同步文件到本地(会创建备份)
  ${GREEN}watch${NC}            监控文件变化并自动同步(Ctrl+C 停止)
  ${GREEN}exec <命令>${NC}      在远程设备上执行命令
  ${GREEN}read <文件>${NC}      读取远程文件内容
  ${GREEN}logs [模式]${NC}      查看远程日志文件(默认: *.log)
  ${GREEN}shell${NC}            打开远程 Shell 会话
  ${GREEN}help${NC}             显示此帮助信息

${BLUE}示例:${NC}
  $0 status                              # 查看状态
  $0 sync-to                             # 同步到远程
  $0 watch                               # 启动自动同步
  $0 exec "python main.py"               # 执行 Python 脚本
  $0 exec "pip install -r requirements.txt"  # 安装依赖
  $0 read "config.yaml"                  # 读取配置文件
  $0 logs "app.log"                      # 查看应用日志
  $0 shell                               # 打开远程终端

${BLUE}配置:${NC}
  配置文件: ${YELLOW}.remote-config.json${NC}
  修改配置后重新运行相应命令即可生效

${BLUE}Claude Code 集成:${NC}
  在 Claude Code 中使用此工具,告诉 AI:

  "我正在使用远程边缘设备开发。
   使用 ./remote_toolkit.sh 与远程设备交互。

   可用命令:
   - ./remote_toolkit.sh exec [命令] - 远程执行
   - ./remote_toolkit.sh sync-to - 同步到远程
   - ./remote_toolkit.sh watch - 自动同步模式

   当前任务:[描述任务]"

${BLUE}提示:${NC}
  - 开发时建议使用 watch 模式,文件会自动同步
  - sync-from 会自动创建本地备份到 .backup/ 目录
  - 使用 shell 命令可以进入远程设备进行交互式操作

EOF
}

# 主命令分发
case "$1" in
  status)
    show_status
    ;;
  setup)
    if check_connection; then
      setup_remote
    else
      echo -e "${RED}❌ 无法连接到远程设备${NC}"
      exit 1
    fi
    ;;
  sync-to)
    if check_connection; then
      sync_to_remote
    else
      echo -e "${RED}❌ 无法连接到远程设备${NC}"
      exit 1
    fi
    ;;
  sync-from)
    if check_connection; then
      sync_from_remote
    else
      echo -e "${RED}❌ 无法连接到远程设备${NC}"
      exit 1
    fi
    ;;
  exec)
    if check_connection; then
      shift
      if [ -z "$1" ]; then
        echo -e "${RED}❌ 错误: 请指定要执行的命令${NC}"
        echo -e "${YELLOW}用法: $0 exec <命令>${NC}"
        exit 1
      fi
      remote_exec "$@"
    else
      echo -e "${RED}❌ 无法连接到远程设备${NC}"
      exit 1
    fi
    ;;
  read)
    if check_connection; then
      remote_read "$2"
    else
      echo -e "${RED}❌ 无法连接到远程设备${NC}"
      exit 1
    fi
    ;;
  watch)
    if check_connection; then
      watch_sync
    else
      echo -e "${RED}❌ 无法连接到远程设备${NC}"
      exit 1
    fi
    ;;
  logs)
    if check_connection; then
      remote_logs "$2"
    else
      echo -e "${RED}❌ 无法连接到远程设备${NC}"
      exit 1
    fi
    ;;
  shell)
    if check_connection; then
      remote_shell
    else
      echo -e "${RED}❌ 无法连接到远程设备${NC}"
      exit 1
    fi
    ;;
  help|--help|-h|"")
    show_help
    ;;
  *)
    echo -e "${RED}❌ 未知命令: $1${NC}"
    echo ""
    show_help
    exit 1
    ;;
esac

6. CLAUDE.md.template

bash 复制代码
# 项目背景:远程边缘设备开发

## 🎯 核心信息

本项目运行在**远程边缘设备**上,本地环境不具备运行条件。

**重要**:
- 本地只用于代码编辑
- 所有执行、测试都在远程设备上进行
- 文件修改会自动同步到远程设备(如果 watch 模式启动)

## 📡 远程设备配置

- **设备名称**: {{DEVICE_NAME}}
- **远程路径**: {{REMOTE_PATH}}
- **连接方式**: SSH (配置已完成)
- **同步状态**: 自动同步(watch 模式)或手动同步

配置文件位于: `.remote-config.json`

## 🛠️ 可用工具

### 核心命令:remote_toolkit.sh

所有与远程设备的交互都通过 `./remote_toolkit.sh` 进行:

``bash
# 基本操作
./remote_toolkit.sh status        # 查看远程设备状态
./remote_toolkit.sh sync-to       # 同步到远程
./remote_toolkit.sh sync-from     # 从远程同步
./remote_toolkit.sh watch         # 自动监控并同步

# 远程执行
./remote_toolkit.sh exec "命令"    # 在远程设备上执行命令
./remote_toolkit.sh read "文件"    # 读取远程文件
./remote_toolkit.sh logs "日志"    # 查看远程日志
./remote_toolkit.sh shell         # 打开远程终端
``

## 📋 工作流程

### 标准开发流程

1. **本地编辑**: 使用 Read、Write、Edit 工具正常编辑文件
2. **自动同步**: 如果 watch 模式运行中,修改会自动同步
3. **远程执行**: 使用 `exec` 命令在远程设备上运行和测试
4. **查看结果**: 使用 `logs` 或 `read` 查看输出和日志

### 示例工作流

**场景 1: 修改代码并测试**
``bash
# 1. 修改代码(使用 Write 或 Edit 工具)
# 2. 代码自动同步到远程(watch 模式)
# 3. 远程执行测试
./remote_toolkit.sh exec "python main.py"
# 4. 查看日志
./remote_toolkit.sh logs "app.log"
``

**场景 2: 调试问题**
``bash
# 1. 读取远程日志查看错误
./remote_toolkit.sh read "logs/error.log"
# 2. 修改代码修复问题
# 3. 同步并测试
./remote_toolkit.sh exec "python main.py"
``

**场景 3: 安装依赖**
``bash
# 在远程设备上安装 Python 包
./remote_toolkit.sh exec "pip install requests"
./remote_toolkit.sh exec "pip install -r requirements.txt"
``

## 💡 最佳实践

### ✅ 应该做的

1. **使用本地工具编辑文件**
   - 使用 Read、Write、Edit 工具修改代码
   - 文件会自动同步到远程(watch 模式下)

2. **远程执行所有运行命令**
   ``bash
   ./remote_toolkit.sh exec "python script.py"
   ./remote_toolkit.sh exec "pytest tests/"
   ./remote_toolkit.sh exec "npm start"
   ``

3. **使用 read 查看远程文件**
   ``bash
   ./remote_toolkit.sh read "config.yaml"
   ./remote_toolkit.sh read "logs/app.log"
   ``

4. **修改前先同步最新代码**
   ``bash
   ./remote_toolkit.sh sync-from  # 获取远程最新版本
   ``

### ❌ 不应该做的

1. **不要在本地执行项目代码**
   - ❌ 不要: `python main.py`(本地环境不支持)
   - ✅ 应该: `./remote_toolkit.sh exec "python main.py"`

2. **不要假设本地环境可用**
   - 本地可能缺少依赖、库、数据等
   - 所有测试和运行都在远程进行

3. **不要直接在远程修改文件**
   - 应该在本地修改后同步
   - 保持"本地编辑 → 同步 → 远程执行"的流程

## 🔧 常见任务参考

### Python 项目

``bash
# 安装依赖
./remote_toolkit.sh exec "pip install -r requirements.txt"

# 运行主程序
./remote_toolkit.sh exec "python main.py"

# 运行测试
./remote_toolkit.sh exec "pytest tests/ -v"

# 查看 Python 版本
./remote_toolkit.sh exec "python --version"

# 检查已安装的包
./remote_toolkit.sh exec "pip list"
``

### Node.js 项目

``bash
# 安装依赖
./remote_toolkit.sh exec "npm install"

# 运行项目
./remote_toolkit.sh exec "npm start"

# 运行测试
./remote_toolkit.sh exec "npm test"

# 查看 Node 版本
./remote_toolkit.sh exec "node --version"
``

### Docker 项目

``bash
# 构建镜像
./remote_toolkit.sh exec "docker build -t myapp ."

# 运行容器
./remote_toolkit.sh exec "docker run -d -p 8080:8080 myapp"

# 查看容器
./remote_toolkit.sh exec "docker ps"

# 查看日志
./remote_toolkit.sh exec "docker logs container_id"
``

### 系统操作

``bash
# 查看系统信息
./remote_toolkit.sh exec "uname -a"

# 查看磁盘使用
./remote_toolkit.sh exec "df -h"

# 查看进程
./remote_toolkit.sh exec "ps aux | grep python"

# 查看端口占用
./remote_toolkit.sh exec "netstat -tulpn | grep 8080"
``

## 🐛 问题排查

### 如果代码没有同步

``bash
# 手动同步到远程
./remote_toolkit.sh sync-to

# 检查同步状态
./remote_toolkit.sh status
``

### 如果远程执行失败

``bash
# 检查远程连接
./remote_toolkit.sh status

# 查看详细错误
./remote_toolkit.sh exec "python main.py 2>&1"

# 查看日志文件
./remote_toolkit.sh logs "error.log"
``

### 如果需要交互式操作

``bash
# 打开远程 Shell
./remote_toolkit.sh shell
# 然后在远程终端中交互操作
``

## 📦 项目结构

``
项目目录/
├── .remote-config.json    # 远程设备配置(本地工具文件,不同步)
├── remote_toolkit.sh      # 远程工具脚本(本地工具文件,不同步)
├── CLAUDE.md             # 本文件(本地工具文件,不同步)
├── .gitignore            # Git 忽略文件
├── README.md             # 项目说明(本地文档,不同步)
├── .backup/              # 同步备份(自动创建)
└── [项目文件]            # 你的代码文件(会同步到远程)
``

**注意**: CLAUDE.md、README.md、remote_toolkit.sh 等工具文件仅保留在本地,不会同步到远程设备。

## 🚨 重要提醒

1. **文件会自动同步**: 在 watch 模式下,本地文件修改后会自动同步到远程(工具文件除外)
2. **执行在远程**: 所有代码执行、测试都在远程设备上进行
3. **日志在远程**: 程序输出的日志文件在远程设备上
4. **配置已完成**: SSH 连接和密钥已配置好,无需手动处理
5. **本地工具文件**: CLAUDE.md、README.md、remote_toolkit.sh 仅保留在本地

## 📞 获取帮助

``bash
# 查看所有可用命令
./remote_toolkit.sh help

# 查看当前状态
./remote_toolkit.sh status
``

---

**记住**: 本地是编辑环境,远程是运行环境。保持这个清晰的分离!

7. 配置文件案例

以高通芯片为例:

gaotong.conf

bash 复制代码
# 远程设备配置 - gaotong

DEVICE_NAME="gaotong"
DEVICE_IP="填写边缘设备ip"
DEVICE_USER="用户名"
DEVICE_PORT="边缘设备ssh远程端口"
SSH_KEY_PATH="本地电脑ssh key" 
# 例如:"/Users/admin/.ssh/edge_device_key"
相关推荐
周杰伦_Jay19 小时前
【Mac 上命令行安装 Claude Code】(Claude 的终端版 AI 编程助手)完整指南
人工智能·macos·claude code
-嘟囔着拯救世界-1 天前
【保姆级教程】Win11 下从零部署 Claude Code:本地环境配置 + VSCode 可视化界面全流程指南
人工智能·vscode·ai·编辑器·html5·ai编程·claude code
硅基捕手维克托2 天前
无向量 RAG 有多强?PageIndex 凭树形索引革新传统语义检索
大模型·rag·上下文·rag技术·claude code·pageindex
yuanlulu2 天前
Agent_Skills_完全教程「AI生成」
人工智能·大语言模型·agent·智能体·skill·claude code·opencode
AndrewHZ2 天前
【AI黑话日日新】什么是skills?
语言模型·大模型·llm·claude code·skills
王烨潇2 天前
claude code 常用命令
claude code·skills
ssxueyi3 天前
AI编程之智谱+claude code详细安装使用教程
人工智能·ai编程·智谱·claude code
deephub5 天前
Claude Code子代理实战:10个即用模板分享
人工智能·大语言模型·agent·claude code
lyx49495 天前
Claude Code + GLM4.7 避坑指南:解决 Unable to connect to Anthropic services
ai·claude code