diff --git a/management/sanguo_auto_sync/AUTO-SYNC-MANAGEMENT.md b/management/sanguo_auto_sync/AUTO-SYNC-MANAGEMENT.md deleted file mode 100644 index 930a91be0..000000000 --- a/management/sanguo_auto_sync/AUTO-SYNC-MANAGEMENT.md +++ /dev/null @@ -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 轮询方案 | - | \ No newline at end of file diff --git a/management/sanguo_auto_sync/GUIDE_WORKFLOW.md b/management/sanguo_auto_sync/GUIDE_WORKFLOW.md deleted file mode 100644 index 6012aed5e..000000000 --- a/management/sanguo_auto_sync/GUIDE_WORKFLOW.md +++ /dev/null @@ -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 -``` - -## 🔧 故障排除 - -### 问题1:Agent未启动 -```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 -**更新人**:诸葛亮 -**状态**:已部署,待测试 \ No newline at end of file diff --git a/management/sanguo_auto_sync/auto-sync.sh b/management/sanguo_auto_sync/auto-sync.sh deleted file mode 100755 index a5f145cc7..000000000 --- a/management/sanguo_auto_sync/auto-sync.sh +++ /dev/null @@ -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 diff --git a/management/sanguo_auto_sync/ecosystem.config.cjs b/management/sanguo_auto_sync/ecosystem.config.cjs deleted file mode 100644 index 6fa9e8c29..000000000 --- a/management/sanguo_auto_sync/ecosystem.config.cjs +++ /dev/null @@ -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, - } - ] -}; diff --git a/management/sanguo_auto_sync/file-watcher.sh b/management/sanguo_auto_sync/file-watcher.sh deleted file mode 100755 index 361154790..000000000 --- a/management/sanguo_auto_sync/file-watcher.sh +++ /dev/null @@ -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 \ No newline at end of file diff --git a/management/sanguo_auto_sync/restart-watcher.sh b/management/sanguo_auto_sync/restart-watcher.sh deleted file mode 100755 index f0f2e01f3..000000000 --- a/management/sanguo_auto_sync/restart-watcher.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -# 重启文件监控器 -# ========================================== - -cd "$(dirname "$0")" - -./stop-watcher.sh - -# 等待一秒 -sleep 1 - -./start-watcher.sh - -./status-watcher.sh diff --git a/management/sanguo_auto_sync/simple-file-watcher.py b/management/sanguo_auto_sync/simple-file-watcher.py deleted file mode 100755 index 1cdb8489c..000000000 --- a/management/sanguo_auto_sync/simple-file-watcher.py +++ /dev/null @@ -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() \ No newline at end of file diff --git a/management/sanguo_auto_sync/start-simple-watcher.sh b/management/sanguo_auto_sync/start-simple-watcher.sh deleted file mode 100755 index f8f1a1ebb..000000000 --- a/management/sanguo_auto_sync/start-simple-watcher.sh +++ /dev/null @@ -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" \ No newline at end of file diff --git a/management/sanguo_auto_sync/start-watcher.sh b/management/sanguo_auto_sync/start-watcher.sh deleted file mode 100755 index aeac7f506..000000000 --- a/management/sanguo_auto_sync/start-watcher.sh +++ /dev/null @@ -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" diff --git a/management/sanguo_auto_sync/status-simple-watcher.sh b/management/sanguo_auto_sync/status-simple-watcher.sh deleted file mode 100755 index 708454539..000000000 --- a/management/sanguo_auto_sync/status-simple-watcher.sh +++ /dev/null @@ -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 \ No newline at end of file diff --git a/management/sanguo_auto_sync/status-watcher.sh b/management/sanguo_auto_sync/status-watcher.sh deleted file mode 100755 index 37ade0501..000000000 --- a/management/sanguo_auto_sync/status-watcher.sh +++ /dev/null @@ -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 diff --git a/management/sanguo_auto_sync/stop-simple-watcher.sh b/management/sanguo_auto_sync/stop-simple-watcher.sh deleted file mode 100755 index dd7e09a42..000000000 --- a/management/sanguo_auto_sync/stop-simple-watcher.sh +++ /dev/null @@ -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" \ No newline at end of file diff --git a/management/sanguo_auto_sync/stop-watcher.sh b/management/sanguo_auto_sync/stop-watcher.sh deleted file mode 100755 index c4645cccd..000000000 --- a/management/sanguo_auto_sync/stop-watcher.sh +++ /dev/null @@ -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 diff --git a/management/sanguo_auto_sync/sync-workflow.sh b/management/sanguo_auto_sync/sync-workflow.sh deleted file mode 100755 index 6d5a7bde6..000000000 --- a/management/sanguo_auto_sync/sync-workflow.sh +++ /dev/null @@ -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 "🚀 下一步:按照工作流规则整理最新调研结果" \ No newline at end of file diff --git a/management/sanguo_auto_sync/watcher.pid b/management/sanguo_auto_sync/watcher.pid deleted file mode 100644 index 579942c7a..000000000 --- a/management/sanguo_auto_sync/watcher.pid +++ /dev/null @@ -1 +0,0 @@ -38830