auto-sync: 2026-04-11 16:34:18

This commit is contained in:
cfdaily
2026-04-11 16:34:18 +08:00
parent bd68c93b99
commit 059c0b421e
15 changed files with 0 additions and 1355 deletions
@@ -1,158 +0,0 @@
# 自动同步监控系统管理指南
## 系统概述
这是一个基于文件变化监控的自动Git同步系统,监听 `/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live` 目录,当任何文件变化时自动执行双向git同步。
**当前使用方案:fswatch 实时监控** (基于 macOS 内核 FSEvents)
## 核心组件
1. **监控器** (`file-watcher.sh`) - Bash脚本,使用 fswatch 监控文件系统事件
2. **启动脚本** (`start-watcher.sh`) - 启动监控器为后台守护进程
3. **停止脚本** (`stop-watcher.sh`) - 停止监控器
4. **状态脚本** (`status-watcher.sh`) - 检查监控器状态
5. **同步脚本** (`auto-sync.sh`) - 执行git拉取、添加、提交、推送
## 可用方案对比
| 方案 | 机制 | 响应速度 | 资源占用 | 依赖 |
|------|------|----------|----------|------|
| **fswatch** (当前) | 内核事件通知 | **实时 (< 3秒)** | **极低** | 需要 `brew install fswatch` |
| simple-file-watcher | 轮询遍历 | 1分钟 | 中等 | Python 3 (无需额外依赖) |
## 使用方法
### 启动监控器
```bash
cd management/sanguo_auto_sync
./start-watcher.sh
```
### 停止监控器
```bash
./stop-watcher.sh
```
### 检查状态
```bash
./status-watcher.sh
```
### 查看监控日志
```bash
tail -f /Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live/file-watcher.log
```
### 查看同步日志
```bash
tail -f /Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live/auto-sync.log
```
## 文件变化触发流程
```
文件创建/修改/删除
fswatch 内核事件通知 (毫秒级)
监控器检测到变化,防限流等待1秒
执行 auto-sync.sh
1. git pull origin main (拉取远程变更)
2. git add . (添加所有变更)
3. git commit -m "auto-sync: ..." (提交)
4. git push origin main (推送)
完成同步,等待下次变化
```
## 技术细节
### 监控器特性
- **实时事件驱动** - 无需轮询,文件变化立即响应
- **忽略文件**`.log`, `.pyc`, `.tmp`, `~` (临时文件)
- **忽略目录**`.git`, `venv`, `.venv`, `__pycache__`, `node_modules`
- **防重复执行**:使用锁文件 `/tmp/sanguo_sync.lock`,避免频繁触发
- **限流保护**:同步后等待1秒,合并批量变化
- **日志记录**`/.../file-watcher.log`
### 同步脚本特性
- 自动处理未跟踪文件
- **删除检测**:支持文件删除同步
- 错误处理:推送失败重试2次
- 日志记录:`auto-sync.log`
- 防冲突:先pull再push,避免冲突
### PID管理
- PID文件:`management/sanguo_auto_sync/watcher.pid`
- 自动清理:停止时删除PID文件
- 状态检查:通过PID验证进程运行状态
## 故障排除
### 监控器没有启动
1. 检查 fswatch 是否安装:`which fswatch`
2. 如果未安装:`brew install fswatch`
3. 检查脚本权限:`chmod +x file-watcher.sh`
4. 检查日志:`tail -f file-watcher.log`
### 同步失败
1. 检查网络连接
2. 检查Git配置:`git remote -v`
3. 检查Git权限:确保有推送权限
4. 查看错误日志:`tail -f auto-sync.log`
### 文件变化未触发同步
1. 检查监控器是否运行:`./status-watcher.sh`
2. 检查文件是否被忽略(参考上面的忽略列表)
3. 检查锁文件:如果 `/tmp/sanguo_sync.lock` 存在且同步正在进行,等待完成
## 回退方案
如果 fswatch 不可用,可以回退到 Python 轮询方案:
```bash
./stop-watcher.sh
./start-simple-watcher.sh
```
## 系统集成
### 开机自启动
可以将以下命令添加到crontab或launchd以实现开机自启动:
```bash
cd "/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live/management/sanguo_auto_sync" && ./start-watcher.sh
```
### 与其他系统集成
- 可以与CI/CD系统集成
- 可以扩展为多目录监控
- 可以添加通知功能(邮件、Slack、Feishu等)
## 性能考虑
- **fswatch 基于内核事件**,几乎不占用CPU,大部分时间休眠
- 忽略虚拟环境和缓存目录,避免无效事件触发
- 同步脚本有防重复执行机制,避免频繁触发
## 安全注意事项
1. 确保 `.gitignore` 正确配置,不提交敏感信息
2. 监控器在后台运行,确保有适当权限
3. 同步脚本会推送所有变更,确保不推送机密数据
## 维护
- 定期清理日志文件
- 监控磁盘空间
- 检查Git仓库健康状态
## 变更日志
| 日期 | 变更 | 作者 |
|------|------|------|
| 2026-03-26 | 切换到 fswatch 实时监控方案 | 诸葛亮 |
| 2026-03-26 | 修复删除文件检测问题 | 诸葛亮 |
| 2026-03-26 | 添加虚拟环境目录忽略 | 诸葛亮 |
| 2026-03-26 | 初始版本 Python 轮询方案 | - |
@@ -1,197 +0,0 @@
# 🚀 任务管理系统 - 工作流指南
## 概述
基于Gitee文件系统的轻量级任务管理系统,解决Agent通信超时问题。
## 📋 系统架构
### 核心原则
1. **文件驱动**:所有状态通过文件记录
2. **自主决策**:将军自己决定如何执行任务
3. **状态透明**:所有状态在Gitee可查
4. **简单可靠**:纯文件操作,无复杂架构
### 工作流程
```
主公创建任务 → 诸葛亮分配 → 文件系统同步 →
Gitee提交 → Agent接收 → 自主执行 → 回复确认
```
## 📁 目录结构
```
management/
├── tasks/ # 任务管理
│ ├── pending/ # 待分配任务
│ ├── assigned/ # 已分配任务
│ ├── completed/ # 已完成任务
│ └── archived/ # 已归档任务
├── agents/ # 各将军任务目录
│ ├── pangtong/ # 庞统任务目录
│ ├── zhangfei/ # 张飞任务目录
│ ├── guanyu/ # 关羽任务目录
│ ├── zhaoyun/ # 赵云任务目录
│ ├── jiangwei/ # 姜维任务目录
│ └── simayi/ # 司马懿任务目录
└── workflow/ # 工作流脚本
└── scripts/ # 核心脚本
```
## 🔧 核心脚本
### 1. 主公创建任务
```bash
# 极简任务创建脚本
cd /Users/chufeng/.openclaw/agents/main/workspace/projects/sanguo_quant_live
./management/workflow/scripts/create_task_simple.sh "任务描述"
```
### 2. 诸葛亮分配任务
```bash
# 分配任务给指定将军
./management/workflow/scripts/assign_task_simple.sh TASK-20260322195011 pangtong
```
### 3. Agent监控脚本
```bash
# 每个将军运行自己的监控脚本
nohup ./management/workflow/scripts/agent_monitor.sh pangtong > pangtong.log 2>&1 &
```
## 🎯 各将军职责
### 庞统(价值投资)
1. 启动Agent监控器
2. 每30秒检查`management/agents/pangtong/`目录
3. 发现`.task`文件后自主执行
4. 通过`sessions_send`回复确认
### 张飞(技术策略)
1. 启动Agent监控器
2. 每30秒检查`management/agents/zhangfei/`目录
3. 发现`.task`文件后自主执行
4. 通过`sessions_send`回复确认
### 关羽(风险管理)
1. 启动Agent监控器
2. 每30秒检查`management/agents/guanyu/`目录
3. 发现`.task`文件后自主执行
4. 通过`sessions_send`回复确认
### 赵云(数据工程)
1. 启动Agent监控器
2. 每30秒检查`management/agents/zhaoyun/`目录
3. 发现`.task`文件后自主执行
4. 通过`sessions_send`回复确认
### 姜维(平台部署)
1. 启动Agent监控器
2. 每30秒检查`management/agents/jiangwei/`目录
3. 发现`.task`文件后自主执行
4. 通过`sessions_send`回复确认
### 司马懿(质量总监)
1. 启动Agent监控器
2. 每30秒检查`management/agents/simayi/`目录
3. 发现`.task`文件后自主执行
4. 通过`sessions_send`回复确认
## 🚀 使用流程
### 第一步:各将军启动监控
```bash
# 进入项目目录
cd /Users/chufeng/.openclaw/agents/main/workspace/projects/sanguo_quant_live
# 启动监控(将pangtong替换为你的名字)
nohup ./management/workflow/scripts/agent_monitor.sh pangtong > pangtong.log 2>&1 &
# 验证运行
ps aux | grep "agent_monitor.sh pangtong"
```
### 第二步:主公创建任务
```bash
./management/workflow/scripts/create_task_simple.sh "整合选股报告"
```
### 第三步:诸葛亮分配任务
```bash
./management/workflow/scripts/assign_task_simple.sh TASK-20260322195011 pangtong
```
### 第四步:提交到Gitee
```bash
git add .
git commit -m "分配新任务"
git push origin main
```
### 第五步:将军接收并执行
- Agent自动发现`.task`文件
- 自主决定如何执行
- 通过`sessions_send`回复确认
## 📊 监控和日志
### 查看日志
```bash
# 查看你的Agent日志
tail -f pangtong.log
# 查看所有Agent状态
./management/workflow/scripts/check_status.sh
```
### 健康检查
```bash
# 检查Agent是否在运行
./management/workflow/scripts/check_health.sh
```
## 🔧 故障排除
### 问题1Agent未启动
```bash
# 检查进程
ps aux | grep "agent_monitor.sh"
# 重新启动
pkill -f "agent_monitor.sh pangtong"
nohup ./management/workflow/scripts/agent_monitor.sh pangtong > pangtong.log 2>&1 &
```
### 问题2:收不到任务
```bash
# 检查任务目录
ls -la management/agents/pangtong/
# 检查Gitee同步
git pull origin main
```
### 问题3:无法回复确认
- 检查OpenClaw Gateway状态
- 检查`sessions_send`参数
- 检查网络连接
## 🎯 成功标准
### 已验证的功能
1. ✅ 主公创建任务
2. ✅ 诸葛亮分配任务
3. ✅ 文件系统同步
4. ✅ Agent接收任务
5. ✅ Agent自主执行
6. ✅ Agent回复确认
### 系统优势
1. ✅ 无通信超时
2. ✅ 完全自主决策
3. ✅ 状态透明可查
4. ✅ 简单可靠
---
**最后更新**2026-03-22 20:00
**更新人**:诸葛亮
**状态**:已部署,待测试
-117
View File
@@ -1,117 +0,0 @@
#!/bin/bash
# 自动双向同步脚本
# 监控 sanguo_projects 目录下所有子项目,每个子项目是独立 git 仓库
# 双向同步本地和远程Gitee
# 错误处理:失败了记录日志不继续错误扩散
PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects"
LOG_FILE="$PROJECT_DIR/auto-sync.log"
MAX_RETRIES=2
# 需要同步的项目列表(每个都是独立 git 仓库)
PROJECTS=(
"sanguo_quant_live"
"sanguo_mail"
"sanguo_vnpy"
"sanguo_mozi"
)
# 确保目录存在
cd "$PROJECT_DIR" || {
echo "[$(date)] ERROR: Failed to cd into $PROJECT_DIR" >> "$LOG_FILE"
exit 1
}
echo "[$(date)] ========================================" >> "$LOG_FILE"
echo "[$(date)] Starting auto sync for all projects..." >> "$LOG_FILE"
# 同步单个项目函数
sync_project() {
local project=$1
local dir="$PROJECT_DIR/$project"
if [[ ! -d "$dir/.git" ]]; then
echo "[$(date)] [$project] SKIP: not a git repository, skipping" >> "$LOG_FILE"
return 0
fi
echo "[$(date)] [$project] Starting sync..." >> "$LOG_FILE"
cd "$dir"
# 第一步:git pull 拉取远程变更
echo "[$(date)] [$project] Step 1: git pull origin main" >> "$LOG_FILE"
git pull origin main
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo "[$(date)] [$project] WARNING: git pull failed with exit code $exit_code" >> "$LOG_FILE"
# pull失败不推送,避免冲突
return 1
fi
echo "[$(date)] [$project] git pull success" >> "$LOG_FILE"
# 第二步:添加所有变更(包括未跟踪文件)
echo "[$(date)] [$project] Step 2: Adding all changes..." >> "$LOG_FILE"
git add .
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo "[$(date)] [$project] ERROR: git add failed with exit code $exit_code" >> "$LOG_FILE"
return 1
fi
# 第三步:检查是否有内容需要提交
if git diff --cached --quiet; then
# 没有变更需要提交,正常退出
echo "[$(date)] [$project] No changes to commit, done." >> "$LOG_FILE"
return 0
fi
# 有变更,进行提交
echo "[$(date)] [$project] Step 3: Found changes to commit, committing..." >> "$LOG_FILE"
git commit -m "auto-sync: $(date '+%Y-%m-%d %H:%M:%S')"
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo "[$(date)] [$project] ERROR: git commit failed with exit code $exit_code" >> "$LOG_FILE"
return 1
fi
# 推送到远程
echo "[$(date)] [$project] Step 4: Pushing to origin/main..." >> "$LOG_FILE"
for i in $(seq 1 $MAX_RETRIES); do
git push origin main
exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "[$(date)] [$project] Push success! Sync complete." >> "$LOG_FILE"
return 0
fi
echo "[$(date)] [$project] Push attempt $i failed, retrying..." >> "$LOG_FILE"
sleep 2
done
echo "[$(date)] [$project] ERROR: Push failed after $MAX_RETRIES attempts" >> "$LOG_FILE"
return 1
}
# 遍历所有项目进行同步
FAILED_PROJECTS=""
for project in "${PROJECTS[@]}"; do
echo "" >> "$LOG_FILE"
sync_project "$project"
if [ $? -ne 0 ]; then
FAILED_PROJECTS="$FAILED_PROJECTS $project"
fi
done
echo "" >> "$LOG_FILE"
echo "[$(date)] Sync finished." >> "$LOG_FILE"
if [[ -n "$FAILED_PROJECTS" ]]; then
echo "[$(date)] WARNING: Some projects failed to sync:$FAILED_PROJECTS" >> "$LOG_FILE"
exit 1
else
echo "[$(date)] All projects synced successfully!" >> "$LOG_FILE"
exit 0
fi
@@ -1,19 +0,0 @@
module.exports = {
apps: [
{
name: 'sanguo-file-watcher',
script: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live/management/sanguo_auto_sync/file-watcher.sh',
cwd: '/Users/chufeng/.openclaw/sanguo_projects',
exec_mode: 'fork',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '100M',
out_file: '/Users/chufeng/.openclaw/sanguo_projects/file-watcher.log',
error_file: '/Users/chufeng/.openclaw/sanguo_projects/file-watcher.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
restart_delay: 5000,
max_restarts: 10,
}
]
};
-104
View File
@@ -1,104 +0,0 @@
#!/bin/bash
# 文件监控脚本
# 实时监控目录变化,触发同步
PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects"
LOG_FILE="$PROJECT_DIR/file-watcher.log"
SYNC_SCRIPT="$PROJECT_DIR/management/sanguo_auto_sync/auto-sync.sh"
LOCK_FILE="/tmp/sanguo_sync.lock"
# 确保脚本有执行权限
chmod +x "$SYNC_SCRIPT"
echo "[$(date)] Starting file watcher in $PROJECT_DIR" >> "$LOG_FILE"
echo "[$(date)] Watching for file changes..." >> "$LOG_FILE"
# 创建一个函数来执行同步
run_sync() {
# 检查锁文件,防止重复运行
if [ -f "$LOCK_FILE" ]; then
echo "[$(date)] Sync already in progress, skipping..." >> "$LOG_FILE"
return 0
fi
# 创建锁文件
touch "$LOCK_FILE"
echo "[$(date)] Detected file change, running sync..." >> "$LOG_FILE"
# 执行同步脚本
"$SYNC_SCRIPT"
sync_result=$?
if [ $sync_result -eq 0 ]; then
echo "[$(date)] Sync completed successfully" >> "$LOG_FILE"
else
echo "[$(date)] Sync failed with code $sync_result" >> "$LOG_FILE"
fi
# 删除锁文件
rm -f "$LOCK_FILE"
}
# 使用fswatch监控文件变化
# fswatch是一个跨平台的文件系统监控工具
# 如果没有安装fswatch,使用inotifywait或find命令替代
# 检查fswatch是否可用
if command -v fswatch &> /dev/null; then
echo "[$(date)] Using fswatch for file monitoring" >> "$LOG_FILE"
# fswatch: -e 排除不需要的目录和文件,-r 递归,-0 输出null分隔符
fswatch \
-e "\.git" \
-e "__pycache__" \
-e "venv" \
-e "\.venv" \
-e "node_modules" \
-e "\.log$" \
-e "\.pyc$" \
-e "\.tmp$" \
-r -0 "$PROJECT_DIR" | while read -d "" event
do
# 过滤掉一些不必要的文件类型
if [[ ! "$event" =~ \.log$ ]] && [[ ! "$event" =~ \.pyc$ ]] && [[ ! "$event" =~ \.tmp$ ]] && [[ ! "$event" =~ ~$ ]]; then
run_sync
# 添加1秒延迟避免频繁触发
sleep 1
fi
done
elif command -v inotifywait &> /dev/null; then
echo "[$(date)] Using inotifywait for file monitoring" >> "$LOG_FILE"
# inotifywait: -r 递归,-m 持续监控,-e 事件类型
inotifywait -r -m -e create,modify,delete,move "$PROJECT_DIR" --exclude "\.git" --format "%w%f" | while read path
do
# 过滤掉日志文件
if [[ ! "$path" =~ \.log$ ]] && [[ ! "$path" =~ \.tmp$ ]] && [[ ! "$path" =~ ~$ ]]; then
run_sync
# 添加1秒延迟避免频繁触发
sleep 1
fi
done
else
echo "[$(date)] WARNING: fswatch and inotifywait not found, falling back to find polling" >> "$LOG_FILE"
echo "[$(date)] This is less efficient but will work" >> "$LOG_FILE"
# 使用find命令进行轮询(每5秒检查一次)
last_check_time=$(date +%s)
while true; do
current_time=$(date +%s)
# 检查是否有文件在最近5秒内被修改
# find命令查找最近修改的文件
changed_files=$(find "$PROJECT_DIR" -type f ! -name "*.log" ! -name "*.tmp" ! -name "*~" ! -path "*/.git/*" -mtime -5s 2>/dev/null | head -10)
if [ -n "$changed_files" ]; then
# 有文件变化,执行同步
run_sync
fi
# 等待5秒
sleep 5
done
fi
@@ -1,15 +0,0 @@
#!/bin/bash
# 重启文件监控器
# ==========================================
cd "$(dirname "$0")"
./stop-watcher.sh
# 等待一秒
sleep 1
./start-watcher.sh
./status-watcher.sh
@@ -1,212 +0,0 @@
#!/usr/bin/env python3
"""
简单的文件监控脚本
使用轮询方式检查文件变化,触发同步
"""
import os
import sys
import time
import subprocess
import logging
import threading
from datetime import datetime
from pathlib import Path
# 配置
PROJECT_DIR = "/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
SELF_DIR = os.path.dirname(os.path.abspath(__file__))
LOG_FILE = os.path.join(PROJECT_DIR, "simple-watcher.log")
SYNC_SCRIPT = os.path.join(PROJECT_DIR, "management/sanguo_auto_sync/auto-sync.sh")
LOCK_FILE = "/tmp/sanguo_sync.lock"
CHECK_INTERVAL = 60 # 检查间隔(秒)= 1 分钟
IGNORE_EXTENSIONS = ['.log', '.tmp', '~', '.pyc']
IGNORE_DIRS = ['.git', '__pycache__', 'venv', '.venv', 'node_modules']
# 设置日志
logging.basicConfig(
level=logging.INFO,
format='[%(asctime)s] %(message)s',
handlers=[
logging.FileHandler(LOG_FILE),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
class FileWatcher:
def __init__(self, directory):
self.directory = Path(directory)
self.last_modified = {}
self.running = True
# 初始化文件状态
self._init_file_states()
def _init_file_states(self):
"""初始化文件修改时间记录"""
for root, dirs, files in os.walk(self.directory):
# 跳过忽略的目录
dirs[:] = [d for d in dirs if d not in IGNORE_DIRS]
for file in files:
# 跳过忽略的文件类型
if any(file.endswith(ext) for ext in IGNORE_EXTENSIONS):
continue
filepath = Path(root) / file
try:
self.last_modified[str(filepath)] = filepath.stat().st_mtime
except (OSError, FileNotFoundError):
pass
def _should_ignore(self, filepath):
"""检查是否应该忽略该文件"""
path_str = str(filepath)
# 检查文件扩展名
if any(path_str.endswith(ext) for ext in IGNORE_EXTENSIONS):
return True
# 检查目录
for ignore_dir in IGNORE_DIRS:
if f"/{ignore_dir}/" in path_str or path_str.endswith(f"/{ignore_dir}"):
return True
return False
def check_for_changes(self):
"""检查文件变化"""
changes_detected = False
# 第一步:遍历当前目录,检测新增和修改
for root, dirs, files in os.walk(self.directory):
# 跳过忽略的目录
dirs[:] = [d for d in dirs if d not in IGNORE_DIRS]
for file in files:
filepath = Path(root) / file
filepath_str = str(filepath)
# 检查是否应该忽略
if self._should_ignore(filepath):
continue
try:
current_mtime = filepath.stat().st_mtime
last_mtime = self.last_modified.get(filepath_str)
if last_mtime is None:
# 新文件
self.last_modified[filepath_str] = current_mtime
changes_detected = True
logger.info(f"New file detected: {filepath.relative_to(self.directory)}")
elif current_mtime > last_mtime:
# 文件被修改
self.last_modified[filepath_str] = current_mtime
changes_detected = True
logger.info(f"File modified: {filepath.relative_to(self.directory)}")
except (OSError, FileNotFoundError):
# 文件被删除
if filepath_str in self.last_modified:
del self.last_modified[filepath_str]
changes_detected = True
logger.info(f"File deleted: {filepath.relative_to(self.directory)}")
# 第二步:反向检查 - 已记录的文件是否还存在
# 找出已不存在的文件(删除检测)
existing_files = list(self.last_modified.keys())
for filepath_str in existing_files:
filepath = Path(filepath_str)
if self._should_ignore(filepath):
continue
if not filepath.exists():
# 文件已被删除
del self.last_modified[filepath_str]
changes_detected = True
try:
rel_path = filepath.relative_to(self.directory)
logger.info(f"File deleted: {rel_path}")
except:
logger.info(f"File deleted: {filepath_str}")
return changes_detected
def run_sync(self):
"""运行同步脚本"""
# 检查锁文件
if os.path.exists(LOCK_FILE):
logger.info("Sync already in progress, skipping...")
return
# 创建锁文件
try:
with open(LOCK_FILE, 'w') as f:
f.write(str(datetime.now()))
except:
pass
try:
logger.info("Detected file change, running sync...")
# 运行同步脚本
result = subprocess.run([SYNC_SCRIPT], capture_output=True, text=True)
if result.returncode == 0:
logger.info("Sync completed successfully")
else:
logger.error(f"Sync failed with code {result.returncode}")
if result.stderr:
logger.error(f"Error output: {result.stderr}")
finally:
# 删除锁文件
try:
os.remove(LOCK_FILE)
except:
pass
def start(self):
"""开始监控"""
logger.info(f"Starting file watcher in {self.directory}")
logger.info(f"Check interval: {CHECK_INTERVAL} seconds")
logger.info(f"Sync script: {SYNC_SCRIPT}")
try:
while self.running:
if self.check_for_changes():
self.run_sync()
# 同步后等待几秒避免频繁触发
time.sleep(3)
time.sleep(CHECK_INTERVAL)
except KeyboardInterrupt:
logger.info("File watcher stopped by user")
except Exception as e:
logger.error(f"Unexpected error: {e}")
raise
def stop(self):
"""停止监控"""
self.running = False
def main():
# 确保同步脚本存在且可执行
if not os.path.exists(SYNC_SCRIPT):
logger.error(f"Sync script not found: {SYNC_SCRIPT}")
sys.exit(1)
# 确保可执行
if not os.access(SYNC_SCRIPT, os.X_OK):
os.chmod(SYNC_SCRIPT, 0o755)
# 创建监控器
watcher = FileWatcher(PROJECT_DIR)
# 开始监控
watcher.start()
if __name__ == "__main__":
main()
@@ -1,48 +0,0 @@
#!/bin/bash
# 启动简单文件监控脚本
PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
WATCHER_SCRIPT="$PROJECT_DIR/management/sanguo_auto_sync/simple-file-watcher.py"
PID_FILE="$PROJECT_DIR/simple-watcher.pid"
LOG_FILE="$PROJECT_DIR/simple-watcher.log"
echo "Starting simple file watcher daemon..."
# 检查是否已经运行
if [ -f "$PID_FILE" ]; then
pid=$(cat "$PID_FILE")
if ps -p "$pid" > /dev/null 2>&1; then
echo "Simple file watcher is already running with PID $pid"
echo "To stop it, run: kill $pid && rm -f $PID_FILE"
exit 0
else
echo "Stale PID file found, removing..."
rm -f "$PID_FILE"
fi
fi
# 确保Python脚本可执行
chmod +x "$WATCHER_SCRIPT"
# 运行监控脚本(后台运行)
echo "Starting watcher process..."
nohup python3 "$WATCHER_SCRIPT" > /dev/null 2>&1 &
watcher_pid=$!
# 保存PID
echo $watcher_pid > "$PID_FILE"
echo "Simple file watcher started with PID $watcher_pid"
echo "PID saved to: $PID_FILE"
echo "Log file: $LOG_FILE"
echo ""
echo "To stop the watcher, run:"
echo " kill $(cat $PID_FILE) && rm -f $PID_FILE"
echo "or use: stop-simple-watcher.sh"
echo ""
echo "To view logs:"
echo " tail -f $LOG_FILE"
echo ""
echo "Watcher is now monitoring: $PROJECT_DIR"
echo "Files changed will trigger: $PROJECT_DIR/management/sanguo_auto_sync/auto-sync.sh"
@@ -1,27 +0,0 @@
#!/bin/bash
# 启动文件监控器 (fswatch 版本)
# ============================================
cd "$(dirname "$0")"
# 检查是否已经运行
if [ -f "watcher.pid" ]; then
PID=$(cat "watcher.pid")
if kill -0 $PID 2>/dev/null; then
echo "✓ File watcher already running with PID $PID"
exit 0
else
echo "✓ PID file found but process not running, starting..."
rm -f "watcher.pid"
fi
fi
# 启动监控器 (fswatch 版本)
nohup ./file-watcher.sh >> "/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live/file-watcher.log" 2>&1 &
PID=$!
echo $PID > "watcher.pid"
echo "✓ File watcher (fswatch) started with PID $PID"
echo " Log: /Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live/file-watcher.log"
echo " To stop: ./management/sanguo_auto_sync/stop-watcher.sh"
@@ -1,77 +0,0 @@
#!/bin/bash
# 检查简单文件监控脚本状态
PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
PID_FILE="$PROJECT_DIR/simple-watcher.pid"
LOG_FILE="$PROJECT_DIR/simple-watcher.log"
echo "=== Simple File Watcher Status ==="
echo "Project Directory: $PROJECT_DIR"
echo ""
# 检查PID文件
if [ -f "$PID_FILE" ]; then
pid=$(cat "$PID_FILE")
echo "PID File: $PID_FILE"
echo "Recorded PID: $pid"
if ps -p "$pid" > /dev/null 2>&1; then
echo "Status: ✅ RUNNING (PID: $pid)"
# 获取进程信息
echo ""
echo "Process Info:"
ps -p "$pid" -o pid,ppid,user,%cpu,%mem,etime,command
# 检查打开的文件
echo ""
echo "Open Files (lsof):"
lsof -p "$pid" 2>/dev/null | head -10
else
echo "Status: ❌ NOT RUNNING (stale PID)"
echo "Note: PID file exists but process is not running"
fi
else
echo "Status: ❌ NOT RUNNING"
echo "Reason: PID file not found"
fi
echo ""
# 检查日志文件
if [ -f "$LOG_FILE" ]; then
log_size=$(stat -f%z "$LOG_FILE" 2>/dev/null || stat -c%s "$LOG_FILE" 2>/dev/null)
echo "Log File: $LOG_FILE"
echo "Log Size: $log_size bytes"
echo ""
echo "=== Last 10 Log Entries ==="
tail -10 "$LOG_FILE" 2>/dev/null || echo "(log file empty or unreadable)"
else
echo "Log File: Not found"
fi
echo ""
# 检查是否有其他监控进程
echo "=== Other Watcher Processes ==="
echo "Active simple-file-watcher.py processes:"
ps aux | grep "simple-file-watcher.py" | grep -v grep
echo ""
echo "=== Quick Commands ==="
echo "Start watcher: ./start-simple-watcher.sh"
echo "Stop watcher: ./stop-simple-watcher.sh"
echo "View logs: tail -f $LOG_FILE"
echo ""
echo "=== Auto-sync Script ==="
SYNC_SCRIPT="$PROJECT_DIR/auto-sync.sh"
if [ -f "$SYNC_SCRIPT" ] && [ -x "$SYNC_SCRIPT" ]; then
echo "✅ Sync script exists and is executable"
else
echo "❌ Sync script missing or not executable"
fi
@@ -1,27 +0,0 @@
#!/bin/bash
# 检查文件监控器状态
# ============================================
if [ ! -f "../watcher.pid" ]; then
echo "=== File Watcher Status ==="
echo "Status: NOT RUNNING"
echo "To start: ./management/start-watcher.sh"
exit 0
fi
PID=$(cat "../watcher.pid")
if kill -0 $PID 2>/dev/null; then
echo "=== File Watcher Status ==="
echo "Status: ✅ RUNNING"
echo "PID: $PID"
echo "Check interval: 60 seconds (1 minute)"
echo "Log: file-watcher.log"
echo "Project directory: /Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
else
echo "=== File Watcher Status ==="
echo "Status: ❌ NOT RUNNING (PID file exists but process dead)"
echo "To start: ./management/start-watcher.sh"
rm -f "../watcher.pid"
fi
@@ -1,57 +0,0 @@
#!/bin/bash
# 停止简单文件监控脚本
PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
PID_FILE="$PROJECT_DIR/simple-watcher.pid"
echo "Stopping simple file watcher..."
if [ -f "$PID_FILE" ]; then
pid=$(cat "$PID_FILE")
if ps -p "$pid" > /dev/null 2>&1; then
echo "Killing process with PID $pid..."
kill "$pid"
# 等待进程结束
sleep 1
if ps -p "$pid" > /dev/null 2>&1; then
echo "Process still running, sending SIGKILL..."
kill -9 "$pid"
fi
echo "Process stopped"
else
echo "No running process found with PID $pid"
fi
# 删除PID文件
rm -f "$PID_FILE"
echo "PID file removed: $PID_FILE"
else
echo "PID file not found: $PID_FILE"
echo "Trying to find and kill any running simple-file-watcher processes..."
# 查找并杀死相关进程
pids=$(ps aux | grep "simple-file-watcher.py" | grep -v grep | awk '{print $2}')
if [ -n "$pids" ]; then
echo "Found processes: $pids"
for pid in $pids; do
echo "Killing PID $pid..."
kill "$pid" 2>/dev/null
sleep 0.5
if ps -p "$pid" > /dev/null 2>&1; then
kill -9 "$pid" 2>/dev/null
fi
done
echo "All simple file watcher processes stopped"
else
echo "No simple file watcher processes found"
fi
fi
echo "Simple file watcher stopped successfully"
@@ -1,23 +0,0 @@
#!/bin/bash
# 停止文件监控器
# ============================================
cd "$(dirname "$0")"
if [ ! -f "watcher.pid" ]; then
echo "✓ No PID file found, watcher not running"
exit 0
fi
PID=$(cat "watcher.pid")
if kill -0 $PID 2>/dev/null; then
echo "✓ Stopping file watcher (PID $PID)"
kill $PID
rm -f "watcher.pid"
echo "✓ Stopped"
else
echo "✓ Process $PID not running, removing PID file"
rm -f "watcher.pid"
fi
@@ -1,273 +0,0 @@
#!/bin/bash
# 三国量化任务平台 - 工作流同步脚本
# 按照workflow-rules.md进行目录整理和同步
echo "=== 🚀 三国量化任务平台 - 工作流同步 ==="
echo "⏰ 当前时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "📖 当前目录: $(pwd)"
echo "📋 当前用户: $(whoami)"
echo ""
# 检查是否在正确目录
if [ ! -d "sanguo_quant_live" ]; then
echo "❌ 错误:未找到sanguo_quant_live目录"
echo "请进入正确的工作区目录"
exit 1
fi
# 进入sanguo_quant_live目录
cd sanguo_quant_live || exit 1
echo "📂 当前Git状态检查:"
git status
echo ""
echo "=== 🔄 第一步:拉取最新代码 ==="
echo "正在从远程仓库拉取最新变更..."
git pull origin main
if [ $? -ne 0 ]; then
echo "❌ 拉取失败,请检查网络连接"
exit 1
fi
echo "✅ 拉取成功"
echo ""
echo "=== 📂 第二步:查看工作流规则 ==="
if [ -f "management/workflow-rules.md" ]; then
echo "✅ 找到工作流规则文档"
echo "📄 路径:management/workflow-rules.md"
echo ""
echo "🔍 关键内容摘要:"
grep "## 第一层目录结构" -A 25 management/workflow-rules.md | head -30
else
echo "⚠️ 警告:未找到工作流规则文档"
echo "请确认workflow-rules.md文件存在"
fi
echo ""
echo "=== 🔍 第三步:识别将军角色 ==="
CURRENT_DIR=$(basename $(pwd))
# 识别将军角色
case "$CURRENT_DIR" in
"sanguo_quant_live")
echo "📍 在根目录 - 显示所有将军工作区"
echo ""
echo "各将军工作区状态:"
echo ""
# 赵云
if [ -d "zhaoyun-data" ]; then
echo "✅ zhaoyun-data/ (赵云-数据工程)"
echo " 状态:$(ls -la zhaoyun-data/ | head -5)"
echo " 目录数:$(find zhaoyun-data/ -maxdepth 1 -type d | wc -l | xargs)"
echo ""
else
echo "⚠️ zhaoyun-data/ (赵云-数据工程) - 未找到"
echo ""
fi
# 关羽
if [ -d "guanyu-risk" ]; then
echo "✅ guanyu-risk/ (关羽-风控管理)"
echo " 状态:$(ls -la guanyu-risk/ | head -5)"
echo " 目录数:$(find guanyu-risk/ -maxdepth 1 -type d | wc -l | xargs)"
echo ""
else
echo "⚠️ guanyu-risk/ (关羽-风控管理) - 未找到"
echo ""
fi
# 姜维
if [ -d "jiangwei-platform" ]; then
echo "✅ jiangwei-platform/ (姜维-平台基础设施)"
echo " 状态:$(ls -la jiangwei-platform/ | head -5)"
echo " 目录数:$(find jiangwei-platform/ -maxdepth 1 -type d | wc -l | xargs)"
echo ""
else
echo "⚠️ jiangwei-platform/ (姜维-平台基础设施) - 未找到"
echo ""
fi
# 张飞
if [ -d "zhangfei-technical" ]; then
echo "✅ zhangfei-technical/ (张飞-技术策略)"
echo " 状态:$(ls -la zhangfei-technical/ | head -5)"
echo " 目录数:$(find zhangfei-technical/ -maxdepth 1 -type d | wc -l | xargs)"
echo ""
else
echo "⚠️ zhangfei-technical/ (张飞-技术策略) - 未找到"
echo ""
fi
# 庞统
if [ -d "pangtong-value" ]; then
echo "✅ pangtong-value/ (庞统-价值投资)"
echo " 状态:$(ls -la pangtong-value/ | head -5)"
echo " 目录数:$(find pangtong-value/ -maxdepth 1 -type d | wc -l | xargs)"
echo ""
else
echo "⚠️ pangtong-value/ (庞统-价值投资) - 未找到"
echo ""
fi
# 司马懿
if [ -d "simayi-quality" ]; then
echo "✅ simayi-quality/ (司马懿-质量保证)"
echo " 状态:$(ls -la simayi-quality/ | head -5)"
echo " 目录数:$(find simayi-quality/ -maxdepth 1 -type d | wc -l | xargs)"
echo ""
else
echo "⚠️ simayi-quality/ (司马懿-质量保证) - 未找到"
echo ""
fi
# 管理目录
echo "📋 管理目录:"
echo " ✅ archive/ (归档目录)"
echo " ✅ management/ (项目管理)"
echo " ✅ strategies/ (最终成果物)"
echo ""
;;
"zhaoyun-data")
echo "👤 赵云将军 - 数据工程工作区"
echo "📋 你的职责:数据获取、清洗验证、质量检查"
echo ""
echo "🔍 标准目录结构:"
echo " research/ # 调研报告目录"
echo " scripts/ # 数据处理脚本"
echo " data/ # 数据文件"
echo " reports/ # 报告文档"
echo " references/ # 参考资料"
;;
"guanyu-risk")
echo "👤 关羽将军 - 风控管理工作区"
echo "📋 你的职责:风控模块开发、风险控制、安全防护"
echo ""
echo "🔍 标准目录结构:"
echo " research/ # 风险研究目录"
echo " scripts/ # 风控脚本"
echo " reports/ # 风险报告"
echo " references/ # 参考资料"
;;
"jiangwei-platform")
echo "👤 姜维将军 - 平台基础设施工作区"
echo "📋 你的职责:基础设施选型、环境搭建、平台运维"
echo ""
echo "🔍 标准目录结构:"
echo " research/ # 平台研究目录"
echo " scripts/ # 部署脚本"
echo " reports/ # 部署报告"
echo " references/ # 参考资料"
;;
"zhangfei-technical")
echo "👤 张飞将军 - 技术策略工作区"
echo "📋 你的职责:vnpy框架改造、多风格兼容、回测引擎"
echo ""
echo "🔍 标准目录结构:"
echo " research/ # 技术策略研究"
echo " scripts/ # 策略脚本"
echo " reports/ # 回测报告"
echo " references/ # 参考资料"
;;
"pangtong-value")
echo "👤 庞统将军 - 价值投资工作区"
echo "📋 你的职责:价值投资策略、策略设计、代码整合"
echo ""
echo "🔍 标准目录结构:"
echo " research/ # 价值投资研究"
echo " scripts/ # 策略脚本"
echo " reports/ # 策略报告"
echo " references/ # 参考资料"
;;
"simayi-quality")
echo "👤 司马懿将军 - 质量保证工作区"
echo "📋 你的职责:代码审计、质量复核、最终验收"
echo ""
echo "🔍 标准目录结构:"
echo " research/ # 质量标准研究"
echo " scripts/ # 审计脚本"
echo " reports/ # 审计报告"
echo " references/ # 参考资料"
;;
*)
echo "⚠️ 未知目录:$CURRENT_DIR"
echo "请在正确的将军工作区或根目录中执行此脚本"
exit 1
;;
esac
echo ""
echo "=== 📊 第四步:检查标准目录结构 ==="
# 根据所在目录创建标准结构
case "$CURRENT_DIR" in
"zhaoyun-data"|"guanyu-risk"|"jiangwei-platform"|"zhangfei-technical"|"pangtong-value"|"simayi-quality")
echo "🔍 创建标准子目录..."
mkdir -p research scripts reports references
# 如果是赵云,创建data目录
if [ "$CURRENT_DIR" = "zhaoyun-data" ]; then
mkdir -p data
echo " ✅ 创建 data/ 目录"
fi
echo " ✅ 创建 research/ scripts/ reports/ references/ 目录"
;;
esac
echo ""
echo "=== 🔍 第五步:检查变更状态 ==="
git status --porcelain | head -10
echo ""
echo "=== 📤 第六步:提交并推送 ==="
# 检查是否有变更
if [ -n "$(git status --porcelain)" ]; then
echo "发现变更,准备提交..."
git add .
# 获取将军名称作为提交信息
GENERAL_NAME=$(echo "$CURRENT_DIR" | sed 's/-.*//' | sed 's/zhaoyun/赵云/' | sed 's/guanyu/关羽/' | sed 's/jiangwei/姜维/' | sed 's/zhangfei/张飞/' | sed 's/pangtong/庞统/' | sed 's/simayi/司马懿/')
COMMIT_MSG="按工作流规则同步:${GENERAL_NAME}工作区更新"
git commit -m "$COMMIT_MSG"
if [ $? -ne 0 ]; then
echo "❌ 提交失败"
exit 1
fi
echo "✅ 提交成功"
echo ""
echo "正在推送到远程仓库..."
git push origin main
if [ $? -ne 0 ]; then
echo "❌ 推送失败,请检查权限"
exit 1
fi
echo "✅ 推送成功"
else
echo "📭 无变更,跳过提交和推送"
fi
echo ""
echo "=== ✅ 工作流同步完成 ==="
echo "⏰ 完成时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "📋 仓库状态: 已与远程同步"
echo "📋 工作流规则: 请查看 management/workflow-rules.md"
echo ""
echo "🚀 下一步:按照工作流规则整理最新调研结果"
-1
View File
@@ -1 +0,0 @@
38830