623 lines
16 KiB
Markdown
623 lines
16 KiB
Markdown
# NAC记忆系统 - 自动日志总结功能设计
|
||
|
||
**版本**: v1.0
|
||
**日期**: 2026-02-07
|
||
**功能**: 编译停止45分钟后自动生成工作日志
|
||
|
||
---
|
||
|
||
## 📋 功能概述
|
||
|
||
### 需求
|
||
每天工作结束时,自动总结当天的工作内容,生成详细的日志报告。
|
||
|
||
### 触发条件
|
||
**编译停止超过45分钟** - 表示开发者已结束当天工作
|
||
|
||
### 检测"编译活动"的标准
|
||
1. 文件修改(.rs, .go, .charter等源代码文件)
|
||
2. Git提交
|
||
3. NAC Lint检查执行
|
||
4. Cargo build/test命令
|
||
|
||
---
|
||
|
||
## 🏗️ 架构设计
|
||
|
||
### 组件架构
|
||
```
|
||
┌─────────────────────────────────────────┐
|
||
│ NAC Auto Summary Daemon │
|
||
├─────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌───────────────────────────────┐ │
|
||
│ │ Activity Monitor │ │
|
||
│ │ - File watcher │ │
|
||
│ │ - Git monitor │ │
|
||
│ │ - Process monitor │ │
|
||
│ └───────────────┬───────────────┘ │
|
||
│ │ │
|
||
│ ↓ │
|
||
│ ┌───────────────────────────────┐ │
|
||
│ │ Idle Timer (45 min) │ │
|
||
│ └───────────────┬───────────────┘ │
|
||
│ │ │
|
||
│ ↓ │
|
||
│ ┌───────────────────────────────┐ │
|
||
│ │ Summary Generator │ │
|
||
│ │ - Collect daily activities │ │
|
||
│ │ - Generate report │ │
|
||
│ │ - Save to memory system │ │
|
||
│ └───────────────────────────────┘ │
|
||
│ │
|
||
└─────────────────────────────────────────┘
|
||
```
|
||
|
||
### 数据流
|
||
```
|
||
1. 监控编译活动
|
||
↓
|
||
2. 检测到活动 → 重置45分钟计时器
|
||
↓
|
||
3. 45分钟无活动 → 触发总结
|
||
↓
|
||
4. 收集今日数据
|
||
↓
|
||
5. 生成日志报告
|
||
↓
|
||
6. 保存到记忆系统
|
||
↓
|
||
7. 通知用户
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 日志内容设计
|
||
|
||
### 日志结构
|
||
```json
|
||
{
|
||
"summary_id": "SUMMARY_20260207",
|
||
"date": "2026-02-07",
|
||
"work_duration": "8h 30m",
|
||
"activities": {
|
||
"files_modified": [
|
||
{
|
||
"path": "src/consensus/cbpp.rs",
|
||
"changes": "+120 -50",
|
||
"timestamp": "2026-02-07 14:30:00"
|
||
}
|
||
],
|
||
"git_commits": [
|
||
{
|
||
"hash": "abc1234",
|
||
"message": "Implement CBPP consensus",
|
||
"timestamp": "2026-02-07 15:00:00",
|
||
"files": 5,
|
||
"insertions": 200,
|
||
"deletions": 50
|
||
}
|
||
],
|
||
"lint_checks": [
|
||
{
|
||
"timestamp": "2026-02-07 14:25:00",
|
||
"files_checked": 10,
|
||
"violations": 3,
|
||
"severity": "high"
|
||
}
|
||
],
|
||
"memory_records": [
|
||
{
|
||
"type": "problem",
|
||
"id": "P002",
|
||
"title": "CBPP共识实现问题",
|
||
"timestamp": "2026-02-07 16:00:00"
|
||
}
|
||
]
|
||
},
|
||
"statistics": {
|
||
"total_commits": 5,
|
||
"total_files_modified": 25,
|
||
"total_lines_added": 500,
|
||
"total_lines_deleted": 150,
|
||
"lint_violations_fixed": 10,
|
||
"new_problems_solved": 2,
|
||
"new_documents_read": 1
|
||
},
|
||
"highlights": [
|
||
"✅ 完成CBPP共识核心实现",
|
||
"✅ 修复10个NAC Lint违规",
|
||
"✅ 解决2个关键问题"
|
||
],
|
||
"next_day_plan": [
|
||
"继续完成CSNP网络协议",
|
||
"优化Blake3哈希性能",
|
||
"编写单元测试"
|
||
]
|
||
}
|
||
```
|
||
|
||
### Markdown报告格式
|
||
```markdown
|
||
# NAC工作日志 - 2026年02月07日
|
||
|
||
**工作时长**: 8小时30分钟
|
||
**开始时间**: 09:00
|
||
**结束时间**: 17:30
|
||
|
||
---
|
||
|
||
## 📊 今日统计
|
||
|
||
- **Git提交**: 5次
|
||
- **文件修改**: 25个文件
|
||
- **代码变更**: +500 -150行
|
||
- **Lint检查**: 3次,修复10个违规
|
||
- **问题解决**: 2个
|
||
- **文档阅读**: 1个
|
||
|
||
---
|
||
|
||
## 📝 主要工作内容
|
||
|
||
### 1. CBPP共识实现 (14:00-17:00)
|
||
- 实现了CBPP核心共识逻辑
|
||
- 完成了Constitutional Block Producer选举
|
||
- 添加了规则验证机制
|
||
|
||
**相关文件**:
|
||
- `src/consensus/cbpp.rs` (+120 -50)
|
||
- `src/consensus/validator.rs` (+80 -20)
|
||
|
||
**相关提交**:
|
||
- `abc1234` - Implement CBPP consensus core
|
||
- `def5678` - Add CBP election logic
|
||
|
||
### 2. NAC Lint违规修复 (10:00-12:00)
|
||
- 修复了10个术语违规
|
||
- 统一使用Asset替代Token
|
||
- 统一使用Certificate替代Contract
|
||
|
||
**检查记录**:
|
||
- 14:25 - 检查10个文件,发现3个违规
|
||
- 15:30 - 全部修复完成
|
||
|
||
### 3. 问题解决 (16:00-17:00)
|
||
- **P002**: CBPP共识实现中的规则验证问题
|
||
- 根本原因: 混淆了规则验证和节点投票
|
||
- 解决方案: 实现纯规则验证机制
|
||
- 状态: 已解决
|
||
|
||
---
|
||
|
||
## 🎯 今日亮点
|
||
|
||
✅ 完成CBPP共识核心实现
|
||
✅ 修复10个NAC Lint违规
|
||
✅ 解决2个关键问题
|
||
✅ 代码质量显著提升
|
||
|
||
---
|
||
|
||
## 📚 今日学习
|
||
|
||
- 深入理解了CBPP的"参与即共识"哲学
|
||
- 掌握了Constitutional Block Producer选举机制
|
||
- 学习了Blake3哈希算法的优化技巧
|
||
|
||
---
|
||
|
||
## ⚠️ 遗留问题
|
||
|
||
- [ ] CSNP网络协议尚未开始
|
||
- [ ] Blake3性能需要进一步优化
|
||
- [ ] 单元测试覆盖率不足
|
||
|
||
---
|
||
|
||
## 📅 明日计划
|
||
|
||
1. 继续完成CSNP网络协议实现
|
||
2. 优化Blake3哈希性能
|
||
3. 编写单元测试,提高覆盖率
|
||
4. 审查今日代码,进行重构
|
||
|
||
---
|
||
|
||
**生成时间**: 2026-02-07 17:45:00
|
||
**自动生成**: NAC Auto Summary v1.0
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 技术实现
|
||
|
||
### 1. 活动监控器 (activity_monitor.py)
|
||
|
||
```python
|
||
import os
|
||
import time
|
||
from watchdog.observers import Observer
|
||
from watchdog.events import FileSystemEventHandler
|
||
|
||
class ActivityMonitor:
|
||
def __init__(self, watch_paths, idle_timeout=2700): # 45分钟
|
||
self.watch_paths = watch_paths
|
||
self.idle_timeout = idle_timeout
|
||
self.last_activity_time = time.time()
|
||
self.activities = []
|
||
|
||
def on_file_modified(self, path):
|
||
"""文件修改事件"""
|
||
self.last_activity_time = time.time()
|
||
self.activities.append({
|
||
'type': 'file_modified',
|
||
'path': path,
|
||
'timestamp': time.time()
|
||
})
|
||
|
||
def on_git_commit(self, commit_hash):
|
||
"""Git提交事件"""
|
||
self.last_activity_time = time.time()
|
||
self.activities.append({
|
||
'type': 'git_commit',
|
||
'hash': commit_hash,
|
||
'timestamp': time.time()
|
||
})
|
||
|
||
def is_idle(self):
|
||
"""检查是否空闲超过45分钟"""
|
||
return (time.time() - self.last_activity_time) > self.idle_timeout
|
||
|
||
def get_today_activities(self):
|
||
"""获取今日所有活动"""
|
||
today_start = time.time() - 86400 # 24小时前
|
||
return [a for a in self.activities if a['timestamp'] > today_start]
|
||
```
|
||
|
||
### 2. 日志总结生成器 (summary_generator.py)
|
||
|
||
```python
|
||
import json
|
||
from datetime import datetime
|
||
import subprocess
|
||
|
||
class SummaryGenerator:
|
||
def __init__(self, workspace_path):
|
||
self.workspace_path = workspace_path
|
||
|
||
def collect_git_commits(self):
|
||
"""收集今日Git提交"""
|
||
cmd = "git log --since='midnight' --pretty=format:'%h|%s|%an|%ad' --date=iso"
|
||
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
|
||
commits = []
|
||
for line in result.stdout.split('\n'):
|
||
if line:
|
||
hash, msg, author, date = line.split('|')
|
||
commits.append({
|
||
'hash': hash,
|
||
'message': msg,
|
||
'author': author,
|
||
'date': date
|
||
})
|
||
return commits
|
||
|
||
def collect_modified_files(self):
|
||
"""收集今日修改的文件"""
|
||
cmd = "git diff --stat HEAD@{midnight}..HEAD"
|
||
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
|
||
# 解析git diff输出
|
||
return self._parse_diff_stat(result.stdout)
|
||
|
||
def collect_lint_checks(self):
|
||
"""收集今日Lint检查记录"""
|
||
# 从日志文件读取
|
||
log_file = f"{self.workspace_path}/memory/logs/lint_{datetime.now().strftime('%Y%m%d')}.log"
|
||
if os.path.exists(log_file):
|
||
with open(log_file, 'r') as f:
|
||
return json.load(f)
|
||
return []
|
||
|
||
def collect_memory_records(self):
|
||
"""收集今日新增的记忆记录"""
|
||
today = datetime.now().strftime('%Y-%m-%d')
|
||
records = []
|
||
|
||
# 检查documents
|
||
for file in os.listdir(f"{self.workspace_path}/memory/documents/"):
|
||
if file.endswith('.json'):
|
||
with open(f"{self.workspace_path}/memory/documents/{file}") as f:
|
||
data = json.load(f)
|
||
if data.get('created_date', '').startswith(today):
|
||
records.append(data)
|
||
|
||
# 检查problems
|
||
for file in os.listdir(f"{self.workspace_path}/memory/problems/"):
|
||
if file.endswith('.json'):
|
||
with open(f"{self.workspace_path}/memory/problems/{file}") as f:
|
||
data = json.load(f)
|
||
if data.get('created_date', '').startswith(today):
|
||
records.append(data)
|
||
|
||
return records
|
||
|
||
def generate_summary(self):
|
||
"""生成完整的日志总结"""
|
||
summary = {
|
||
'summary_id': f"SUMMARY_{datetime.now().strftime('%Y%m%d')}",
|
||
'date': datetime.now().strftime('%Y-%m-%d'),
|
||
'activities': {
|
||
'git_commits': self.collect_git_commits(),
|
||
'files_modified': self.collect_modified_files(),
|
||
'lint_checks': self.collect_lint_checks(),
|
||
'memory_records': self.collect_memory_records()
|
||
}
|
||
}
|
||
|
||
# 生成Markdown报告
|
||
markdown = self.generate_markdown_report(summary)
|
||
|
||
# 保存
|
||
self.save_summary(summary, markdown)
|
||
|
||
return summary, markdown
|
||
|
||
def generate_markdown_report(self, summary):
|
||
"""生成Markdown格式的报告"""
|
||
# ... (见上面的Markdown模板)
|
||
pass
|
||
|
||
def save_summary(self, summary, markdown):
|
||
"""保存总结到记忆系统"""
|
||
# 保存JSON
|
||
json_path = f"{self.workspace_path}/memory/summaries/SUMMARY_{datetime.now().strftime('%Y%m%d')}.json"
|
||
with open(json_path, 'w') as f:
|
||
json.dump(summary, f, indent=2, ensure_ascii=False)
|
||
|
||
# 保存Markdown
|
||
md_path = f"{self.workspace_path}/docs/Daily_Summary_{datetime.now().strftime('%Y%m%d')}.md"
|
||
with open(md_path, 'w') as f:
|
||
f.write(markdown)
|
||
```
|
||
|
||
### 3. 守护进程 (auto_summary_daemon.py)
|
||
|
||
```python
|
||
#!/usr/bin/env python3
|
||
import time
|
||
import signal
|
||
import sys
|
||
from activity_monitor import ActivityMonitor
|
||
from summary_generator import SummaryGenerator
|
||
|
||
class AutoSummaryDaemon:
|
||
def __init__(self, workspace_path):
|
||
self.workspace_path = workspace_path
|
||
self.monitor = ActivityMonitor(
|
||
watch_paths=[f"{workspace_path}/nac-blockchain/src"],
|
||
idle_timeout=2700 # 45分钟
|
||
)
|
||
self.generator = SummaryGenerator(workspace_path)
|
||
self.running = True
|
||
|
||
def signal_handler(self, sig, frame):
|
||
"""处理退出信号"""
|
||
print("\n正在停止守护进程...")
|
||
self.running = False
|
||
sys.exit(0)
|
||
|
||
def run(self):
|
||
"""运行守护进程"""
|
||
signal.signal(signal.SIGINT, self.signal_handler)
|
||
signal.signal(signal.SIGTERM, self.signal_handler)
|
||
|
||
print("NAC Auto Summary Daemon 已启动")
|
||
print("监控编译活动,45分钟无活动后自动生成日志...")
|
||
|
||
while self.running:
|
||
# 检查是否空闲
|
||
if self.monitor.is_idle():
|
||
print("检测到45分钟无活动,开始生成日志...")
|
||
summary, markdown = self.generator.generate_summary()
|
||
print(f"日志已生成: {markdown}")
|
||
|
||
# 重置计时器
|
||
self.monitor.last_activity_time = time.time()
|
||
|
||
# 每分钟检查一次
|
||
time.sleep(60)
|
||
|
||
if __name__ == '__main__':
|
||
daemon = AutoSummaryDaemon('/home/ubuntu/nac-workspace')
|
||
daemon.run()
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 部署方式
|
||
|
||
### 方式1: Systemd服务(推荐)
|
||
|
||
```bash
|
||
# 创建服务文件
|
||
sudo cat > /etc/systemd/system/nac-auto-summary.service << 'EOF'
|
||
[Unit]
|
||
Description=NAC Auto Summary Daemon
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=ubuntu
|
||
WorkingDirectory=/home/ubuntu/nac-workspace
|
||
ExecStart=/usr/bin/python3 /home/ubuntu/nac-workspace/memory/tools/auto_summary_daemon.py
|
||
Restart=on-failure
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
# 启动服务
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable nac-auto-summary
|
||
sudo systemctl start nac-auto-summary
|
||
|
||
# 查看状态
|
||
sudo systemctl status nac-auto-summary
|
||
```
|
||
|
||
### 方式2: Screen会话
|
||
|
||
```bash
|
||
# 启动screen会话
|
||
screen -S nac-summary
|
||
|
||
# 运行守护进程
|
||
cd /home/ubuntu/nac-workspace
|
||
python3 memory/tools/auto_summary_daemon.py
|
||
|
||
# 分离会话: Ctrl+A, D
|
||
# 重新连接: screen -r nac-summary
|
||
```
|
||
|
||
### 方式3: Cron定时检查
|
||
|
||
```bash
|
||
# 添加到crontab
|
||
crontab -e
|
||
|
||
# 每小时检查一次
|
||
0 * * * * /home/ubuntu/nac-workspace/memory/tools/check_and_summarize.sh
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 日志存储
|
||
|
||
### 目录结构
|
||
```
|
||
memory/
|
||
├── summaries/ # 日志总结(JSON)
|
||
│ ├── SUMMARY_20260207.json
|
||
│ ├── SUMMARY_20260208.json
|
||
│ └── index.json
|
||
└── logs/ # 活动日志
|
||
├── lint_20260207.log
|
||
└── activity_20260207.log
|
||
|
||
docs/
|
||
├── Daily_Summary_20260207.md # 日志报告(Markdown)
|
||
└── Daily_Summary_20260208.md
|
||
```
|
||
|
||
---
|
||
|
||
## 🔔 通知方式
|
||
|
||
### 1. 控制台输出
|
||
```
|
||
[2026-02-07 17:45:00] 检测到45分钟无活动
|
||
[2026-02-07 17:45:01] 开始生成今日工作日志...
|
||
[2026-02-07 17:45:05] ✅ 日志已生成: docs/Daily_Summary_20260207.md
|
||
```
|
||
|
||
### 2. 桌面通知(可选)
|
||
```python
|
||
import notify2
|
||
notify2.init('NAC Auto Summary')
|
||
n = notify2.Notification(
|
||
"工作日志已生成",
|
||
"今日工作总结已完成,请查看报告"
|
||
)
|
||
n.show()
|
||
```
|
||
|
||
### 3. 邮件通知(可选)
|
||
```python
|
||
import smtplib
|
||
from email.mime.text import MIMEText
|
||
|
||
def send_email(summary_path):
|
||
msg = MIMEText(f"今日工作日志已生成: {summary_path}")
|
||
msg['Subject'] = 'NAC工作日志 - ' + datetime.now().strftime('%Y-%m-%d')
|
||
msg['From'] = 'nac@example.com'
|
||
msg['To'] = 'developer@example.com'
|
||
|
||
s = smtplib.SMTP('localhost')
|
||
s.send_message(msg)
|
||
s.quit()
|
||
```
|
||
|
||
---
|
||
|
||
## 🧪 测试计划
|
||
|
||
### 测试1: 活动监控
|
||
```bash
|
||
# 模拟编译活动
|
||
touch src/test.rs
|
||
git add src/test.rs
|
||
git commit -m "Test"
|
||
|
||
# 检查活动是否被记录
|
||
python3 -c "from activity_monitor import ActivityMonitor; m = ActivityMonitor(['.']); print(m.get_today_activities())"
|
||
```
|
||
|
||
### 测试2: 空闲检测
|
||
```bash
|
||
# 设置短超时时间(1分钟)用于测试
|
||
python3 memory/tools/auto_summary_daemon.py --timeout 60
|
||
|
||
# 等待1分钟,观察是否触发总结
|
||
```
|
||
|
||
### 测试3: 日志生成
|
||
```bash
|
||
# 手动触发总结
|
||
python3 memory/tools/summary_generator.py --generate
|
||
|
||
# 检查输出文件
|
||
ls -la memory/summaries/
|
||
ls -la docs/Daily_Summary_*.md
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 配置选项
|
||
|
||
### 配置文件: `.nacsummaryrc`
|
||
```json
|
||
{
|
||
"idle_timeout": 2700,
|
||
"watch_paths": [
|
||
"nac-blockchain/src",
|
||
"nac-asset-onchain/src"
|
||
],
|
||
"output_format": "markdown",
|
||
"notification": {
|
||
"enabled": true,
|
||
"type": "console"
|
||
},
|
||
"summary_retention_days": 90
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 未来扩展
|
||
|
||
### Phase 2
|
||
- [ ] AI辅助总结(使用LLM生成更智能的总结)
|
||
- [ ] 周报/月报自动生成
|
||
- [ ] 工作效率分析
|
||
- [ ] 团队协作统计
|
||
|
||
### Phase 3
|
||
- [ ] Web界面查看历史日志
|
||
- [ ] 日志搜索和过滤
|
||
- [ ] 导出为PDF/Word
|
||
- [ ] 与项目管理工具集成
|
||
|
||
---
|
||
|
||
**设计完成,准备实现!** 🚀
|