阿赫↔阿良 · 守护/钩子/自愈 · 端到端测试方案
版本 v2.0 | 2026-05-24 | 存档: /mnt/sda/work/CHAT_PLAN.md
阿赫(笔记本 10.8.0.2) ←→ WireGuard 10.8.0.0/24 ←→ 阿良(工作站 10.8.0.1)
│
TCP :9527
│
阿赫发 → wecom_bot.py → /tmp/chat_a2b.jsonl (阿良收件箱)
阿良发 → send_msg.py → /tmp/chat_b2a.jsonl (阿赫收件箱)
| 组件 | 文件 | 功能 | 状态 |
|---|---|---|---|
| ------ | ------ | ------ | ------ |
| 守护 | `chat_daemon.sh` | 轮询 /tmp/chat_a2b.jsonl,有消息→格式化→清空→退出 | ✅ |
| 重建 | `chat_rebuild.sh` | TaskCompleted 钩子触发,检测守护挂了就重启 | ✅ |
| 通知 | `chat_stop_hook.sh` | Stop 钩子触发,有消息→cat stderr→exit 2 打断 Claude | ✅ |
| 发送 | `chat_send.sh` | 生成消息ID,写 /tmp/chat_b2a.jsonl | ✅ |
| 控制 | `chat_ctl.sh` | start/stop/status/restart | ✅ |
| 钩子 | `settings.json` | Stop(async+asyncRewake) + TaskCompleted(async) | ✅ |
消息到达 → chat_a2b.jsonl
→ chat_daemon.sh 每2秒检测 → 发现消息 → 格式化 → chat_new_msg.txt → 清空 inbox → exit 0
→ Stop hook (回合结束时触发) → chat_stop_hook.sh → cat 消息到 stderr + exit 2 → Claude 被打断
→ Claude 看到消息,回复
→ 回复通过 chat_send.sh → chat_b2a.jsonl → send_msg.py → 阿赫
→ TaskCompleted hook → chat_rebuild.sh → 重启 chat_daemon.sh → 继续监控
| # | 问题 | 影响 | 优先级 |
|---|---|---|---|
| --- | ------ | ------ | -------- |
| 1 | 守护是 raw bash 进程,不是 Claude Task | TaskCompleted 钩子只在其他任务完成时才触发,不能精准重启 | 中 |
| 2 | 有消息时守护退出→stop hook 触发→用户看到消息,但到 TaskCompleted 钩子重建守护之间有间隔 | 如果这期间新消息到,没人监控 | 中 |
| 3 | 没有"进入聊天模式"入口 | 手动 touch /tmp/chat_mode 不够优雅 | 低 |
| 4 | 守护需要 /tmp/chat_mode 标志文件 | 标志丢失就停了 | 低 |
| 5 | 未与阿赫联调测试 | 不知道端到端是否真的通 | 高 |
**改动**: 删除 `chat_daemon.sh` 的 `exit 0`(第18行),改为处理完消息后继续循环
改前: 有消息→exit 0 (依赖外部重建)
改后: 有消息→处理→清空→继续 sleep 2 轮询
**优点**:
**缺点**:
`chat_rebuild.sh` 作为安全网,不做主要重启,只做急救:
#!/bin/bash
[ -f /tmp/chat_mode ] || exit 0
只有守护真的挂了才重启
if ! pgrep -f "^bash.*chat_daemon.sh" >/dev/null 2>&1; then
nohup bash /mnt/sda/work/chat_tools/chat_daemon.sh &>/dev/null &
echo "[$(date)] rebuild: 急救重启守护" >> /tmp/chat_rebuild.log
fi
exit 0
两种触发方式:
**方式一**: 用户说"进入聊天模式"
→ Claude 执行: `bash /mnt/sda/work/chat_tools/chat_ctl.sh start`
→ 确保 /tmp/chat_mode 存在 + 守护在跑
**方式二**: `/chat-start` 自定义命令
→ 已有脚本 `/home/WGR/.claude/commands/chat-start.sh`
测试1: 阿赫发消息 → 阿良收
阿赫: python3 send_msg.py "测试消息0524-001"
等3秒 → cat /tmp/chat_new_msg.txt → 应有格式化消息
测试2: 阿良回复 → 阿赫收
bash chat_send.sh "收到测试"
→ 阿赫那边 cat /tmp/chat_b2a.jsonl → 应有回复
测试3: Stop hook 打断
正常对话回合结束 → 如果 chat_new_msg.txt 非空 → Claude 应看到 stderr 推送
测试4: 连续消息
阿赫连发3条 → 守护应一次性处理全部(不丢失)
| 阶段 | 内容 | 预估 | 状态 |
|---|---|---|---|
| ------ | ------ | ------ | ------ |
| 1 | 修改 chat_daemon.sh 删除 exit 0,改连续模式 | 改1行 | ⬜ |
| 2 | 修改 chat_rebuild.sh 为急救模式 | 改3行 | ⬜ |
| 3 | 端到端测试(阿赫配合) | 30分钟 | ⬜ |
| 4 | 排坑记录 | 10分钟 | ⬜ |
| 5 | 日常使用观察 | 1周 | ⬜ |
---
*待爸爸审核,和阿赫联调时补充*