Initial sandbox buildout - Structure: projects, docs, inbox, archive, templates, scripts, tools - Tools: search.py, inbox-processor.py, daily-digest.py - Shell aliases and bashrc integration - Templates for projects and notes - MEMORY.md, TASKS.md, STRUCTURE.md - tmux config
This commit is contained in:
105
tools/daily-digest.py
Executable file
105
tools/daily-digest.py
Executable file
@ -0,0 +1,105 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generate a daily digest of workspace activity.
|
||||
"""
|
||||
|
||||
import os
|
||||
from pathlib import Path
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
WORKSPACE = Path("/home/wdjones/.openclaw/workspace")
|
||||
|
||||
def get_recent_files(hours: int = 24) -> list:
|
||||
"""Get files modified in the last N hours."""
|
||||
cutoff = datetime.now() - timedelta(hours=hours)
|
||||
recent = []
|
||||
|
||||
for root, dirs, files in os.walk(WORKSPACE):
|
||||
dirs[:] = [d for d in dirs if not d.startswith('.')]
|
||||
|
||||
for fname in files:
|
||||
fpath = Path(root) / fname
|
||||
try:
|
||||
mtime = datetime.fromtimestamp(fpath.stat().st_mtime)
|
||||
if mtime > cutoff:
|
||||
rel_path = fpath.relative_to(WORKSPACE)
|
||||
recent.append({
|
||||
'path': str(rel_path),
|
||||
'modified': mtime,
|
||||
'size': fpath.stat().st_size
|
||||
})
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
return sorted(recent, key=lambda x: x['modified'], reverse=True)
|
||||
|
||||
|
||||
def get_tasks_summary() -> dict:
|
||||
"""Parse TASKS.md and return summary."""
|
||||
tasks_file = WORKSPACE / "TASKS.md"
|
||||
if not tasks_file.exists():
|
||||
return {}
|
||||
|
||||
summary = {
|
||||
'inbox': [],
|
||||
'in_progress': [],
|
||||
'waiting': [],
|
||||
'done_today': []
|
||||
}
|
||||
|
||||
current_section = None
|
||||
today = datetime.now().strftime("%Y-%m-%d")
|
||||
|
||||
with open(tasks_file) as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line.startswith("## Inbox"):
|
||||
current_section = 'inbox'
|
||||
elif line.startswith("## In Progress"):
|
||||
current_section = 'in_progress'
|
||||
elif line.startswith("## Waiting"):
|
||||
current_section = 'waiting'
|
||||
elif line.startswith("## Done"):
|
||||
current_section = 'done'
|
||||
elif line.startswith("- ["):
|
||||
if current_section == 'done' and today in line:
|
||||
summary['done_today'].append(line)
|
||||
elif current_section in summary:
|
||||
summary[current_section].append(line)
|
||||
|
||||
return summary
|
||||
|
||||
|
||||
def generate_digest():
|
||||
"""Generate the daily digest."""
|
||||
print("=" * 50)
|
||||
print(f"📊 Daily Digest - {datetime.now().strftime('%Y-%m-%d %H:%M')}")
|
||||
print("=" * 50)
|
||||
|
||||
# Recent files
|
||||
recent = get_recent_files(24)
|
||||
print(f"\n📁 Files modified (last 24h): {len(recent)}")
|
||||
for f in recent[:10]:
|
||||
print(f" {f['path']}")
|
||||
if len(recent) > 10:
|
||||
print(f" ... and {len(recent) - 10} more")
|
||||
|
||||
# Tasks
|
||||
tasks = get_tasks_summary()
|
||||
print(f"\n✅ Tasks")
|
||||
print(f" In Progress: {len(tasks.get('in_progress', []))}")
|
||||
print(f" Waiting: {len(tasks.get('waiting', []))}")
|
||||
print(f" Done Today: {len(tasks.get('done_today', []))}")
|
||||
|
||||
# Today's notes
|
||||
today_file = WORKSPACE / "memory" / f"{datetime.now().strftime('%Y-%m-%d')}.md"
|
||||
if today_file.exists():
|
||||
with open(today_file) as f:
|
||||
lines = len(f.readlines())
|
||||
print(f"\n📝 Today's notes: {lines} lines")
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
generate_digest()
|
||||
Reference in New Issue
Block a user