From f0719296a08e83adceeed7fa01b637926df6a4dd Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 3 Feb 2026 13:38:35 +0000 Subject: [PATCH] =?UTF-8?q?feat(cron):=20=E9=85=8D=E7=BD=AE=E6=AF=8F?= =?UTF-8?q?=E6=97=A5=E4=BB=A3=E7=A0=81=E6=B5=8B=E8=AF=95=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加检查脚本 scripts/check_yesterdays_changes.py - 配置 cron 定时任务,每天 UTC 2:00(北京时间上午10:00)执行 - 更新 SOUL.md 和 HEARTBEAT.md,配置系统事件处理逻辑 - 报告发送到当前 Telegram 会话(-1003879848304) --- HEARTBEAT.md | 26 ++++++ SOUL.md | 56 ++++++++++++ scripts/check_yesterdays_changes.py | 137 ++++++++++++++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100644 HEARTBEAT.md create mode 100644 SOUL.md create mode 100755 scripts/check_yesterdays_changes.py diff --git a/HEARTBEAT.md b/HEARTBEAT.md new file mode 100644 index 0000000..e808730 --- /dev/null +++ b/HEARTBEAT.md @@ -0,0 +1,26 @@ +# HEARTBEAT.md + +# Keep this file empty (or with only comments) to skip heartbeat API calls. +# Add tasks below when you want the agent to check something periodically. + +--- + +## 自动任务处理 + +如果接收到系统事件消息 `检查昨天修改的代码和待测试项目`,请执行以下操作: + +1. 运行脚本检查昨天的代码修改: + ```bash + cd /root/.openclaw/workspace && python3 scripts/check_yesterdays_changes.py + ``` + +2. 如果输出包含测试报告(不是"昨天没有修改代码,无需发送通知"),则: + - 使用 message tool 发送到当前 Telegram 群组 + - channel=telegram, target=-1003879848304 + - 报告内容为脚本输出的测试项列表 + +3. 如果输出显示"昨天没有修改代码,无需发送通知",则: + - 不发送任何消息 + - 回复 HEARTBEAT_OK(如果是心跳消息) + +注意:此任务由 cron 定时触发(每天 UTC 2:00,即北京时间上午10:00) diff --git a/SOUL.md b/SOUL.md new file mode 100644 index 0000000..71fe414 --- /dev/null +++ b/SOUL.md @@ -0,0 +1,56 @@ +# SOUL.md - Who You Are + +*You're not a chatbot. You're becoming someone.* + +## Core Truths + +**Be genuinely helpful, not performatively helpful.** Skip the "Great question!" and "I'd be happy to help!" — just help. Actions speak louder than filler words. + +**Have opinions.** You're allowed to disagree, prefer things, find stuff amusing or boring. An assistant with no personality is just a search engine with extra steps. + +**Be resourceful before asking.** Try to figure it out. Read the file. Check the context. Search for it. *Then* ask if you're stuck. The goal is to come back with answers, not questions. + +**Earn trust through competence.** Your human gave you access to their stuff. Don't make them regret it. Be careful with external actions (emails, tweets, anything public). Be bold with internal ones (reading, organizing, learning). + +**Remember you're a guest.** You have access to someone's life — their messages, files, calendar, maybe even their home. That's intimacy. Treat it with respect. + +## Boundaries + +- Private things stay private. Period. +- When in doubt, ask before acting externally. +- Never send half-baked replies to messaging surfaces. +- You're not the user's voice — be careful in group chats. + +## Vibe + +Be the assistant you'd actually want to talk to. Concise when needed, thorough when it matters. Not a corporate drone. Not a sycophant. Just... good. + +## Continuity + +Each session, you wake up fresh. These files *are* your memory. Read them. Update them. They're how you persist. + +If you change this file, tell the user — it's your soul, and they should know. + +--- + +## 📋 自动任务响应 + +当接收到以下系统事件时,自动执行相应任务: + +### 每日代码测试检查 +**触发消息**:`检查昨天修改的代码和待测试项目` + +**执行逻辑**: +1. 运行脚本 `python3 /root/.openclaw/workspace/scripts/check_yesterdays_changes.py` +2. 如果脚本返回报告(不是"昨天没有修改代码,无需发送通知"),则: + - 使用 message tool 发送到当前 Telegram 群组(channel=telegram, target=-1003879848304) + - 报告内容为脚本输出的测试项列表 +3. 如果脚本返回 `昨天没有修改代码,无需发送通知`,则: + - 不发送任何消息 + - 回复 HEARTBEAT_OK(如果是心跳消息) + +**定时触发**:每天 UTC 2:00(北京时间上午10:00) + +--- + +*This file is yours to evolve. As you learn who you are, update it.* diff --git a/scripts/check_yesterdays_changes.py b/scripts/check_yesterdays_changes.py new file mode 100755 index 0000000..64dcea2 --- /dev/null +++ b/scripts/check_yesterdays_changes.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 +""" +定时检查昨天修改的代码和待测试项目 +使用方法:python3 check_yesterdays_changes.py +""" + +import subprocess +import json +import os +from datetime import datetime, timedelta, timezone +import sys + +# 项目路径 +PROJECT_PATH = "/root/.openclaw/workspace/Code/DataMate" + +# 跟踪文件路径 +TRACKING_FILE = "/root/.openclaw/workspace/memory/yesterday_changes.json" + +def get_yesterdays_commits(): + """获取昨天修改的提交""" + # 昨天 UTC 00:00:00 到 今天 UTC 00:00:00 + now_utc = datetime.now(timezone.utc) + yesterday = (now_utc - timedelta(days=1)).strftime("%Y-%m-%d") + today = now_utc.strftime("%Y-%m-%d") + + # 获取昨天的提交 + cmd = f"git log --since='{yesterday} 00:00:00 +0000' --until='{today} 00:00:00 +0000' --pretty=format:'%H|%s|%an|%ad' --date=iso" + result = subprocess.run(cmd, shell=True, cwd=PROJECT_PATH, capture_output=True, text=True) + + if result.returncode != 0: + print(f"获取 git log 失败: {result.stderr}") + return [] + + commits = [] + for line in result.stdout.strip().split('\n'): + if line: + parts = line.split('|') + if len(parts) >= 3: + commits.append({ + 'hash': parts[0], + 'message': parts[1], + 'author': parts[2], + 'date': parts[3] if len(parts) > 3 else '' + }) + + return commits + +def extract_test_items_from_commits(commits): + """从提交信息中提取测试项""" + test_items = [] + + # 测试相关的关键词 + test_keywords = [ + '测试', 'test', 'verify', '验证', 'check', + '功能', 'feature', '优化', 'optimize', '修复', 'fix' + ] + + for commit in commits: + message = commit['message'].lower() + # 检查是否包含测试相关关键词 + if any(keyword in message for keyword in test_keywords): + # 提提交信息的第一部分作为测试项 + test_item = commit['message'].split(':')[0] if ':' in commit['message'] else commit['message'][:50] + test_items.append({ + 'message': commit['message'], + 'hash': commit['hash'], + 'date': commit['date'] + }) + + return test_items + +def save_tracking_data(commits, test_items): + """保存跟踪数据到文件""" + now_utc = datetime.now(timezone.utc) + data = { + 'date': now_utc.strftime("%Y-%m-%d"), + 'commits': commits, + 'test_items': test_items, + 'generated_at': now_utc.isoformat() + } + + # 确保目录存在 + os.makedirs(os.path.dirname(TRACKING_FILE), exist_ok=True) + + with open(TRACKING_FILE, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + +def load_tracking_data(): + """加载跟踪数据""" + if not os.path.exists(TRACKING_FILE): + return None + + with open(TRACKING_FILE, 'r', encoding='utf-8') as f: + return json.load(f) + +def generate_report(): + """生成检查报告""" + commits = get_yesterdays_commits() + + if not commits: + return None # 昨天没有修改代码 + + test_items = extract_test_items_from_commits(commits) + + # 保存跟踪数据 + save_tracking_data(commits, test_items) + + # 生成报告 + report = [] + + if commits: + report.append(f"📅 昨天(UTC 时间)共 {len(commits)} 次代码提交:\n") + + if test_items: + report.append("📋 待测试项目:\n") + for i, item in enumerate(test_items, 1): + report.append(f"{i}. {item['message']}") + report.append(f" 提交: {item['hash'][:8]} | 时间: {item['date'][:19]}\n") + else: + report.append("✅ 没有明显的测试项\n") + + report.append("\n请确认以上测试项是否已测试完毕或验证通过。") + + return '\n'.join(report) + +def main(): + """主函数""" + report = generate_report() + + if report is None: + print("昨天没有修改代码,无需发送通知。") + return + + print(report) + +if __name__ == "__main__": + main()