133 lines
3.8 KiB
Python
Executable File
133 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Morning briefing generator - creates a daily summary for the human.
|
|
"""
|
|
|
|
import os
|
|
import json
|
|
from datetime import datetime, timedelta
|
|
from pathlib import Path
|
|
|
|
WORKSPACE = Path("/home/wdjones/.openclaw/workspace")
|
|
|
|
def get_weather_stub():
|
|
"""Placeholder for weather - would need API."""
|
|
return "☀️ Weather check not configured"
|
|
|
|
def get_tasks_summary():
|
|
"""Get task summary."""
|
|
tasks_file = WORKSPACE / "TASKS.md"
|
|
if not tasks_file.exists():
|
|
return None
|
|
|
|
summary = {'in_progress': [], 'waiting': [], 'inbox': []}
|
|
section = None
|
|
|
|
with open(tasks_file) as f:
|
|
for line in f:
|
|
if "## Inbox" in line: section = 'inbox'
|
|
elif "## In Progress" in line: section = 'in_progress'
|
|
elif "## Waiting" in line: section = 'waiting'
|
|
elif "## Done" in line: section = None
|
|
elif section and line.strip().startswith("- ["):
|
|
task = line.strip()[6:].strip() # Remove "- [ ] "
|
|
if task:
|
|
summary[section].append(task)
|
|
|
|
return summary
|
|
|
|
def get_yesterday_notes():
|
|
"""Get yesterday's notes summary."""
|
|
yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
|
|
yesterday_file = WORKSPACE / "memory" / f"{yesterday}.md"
|
|
|
|
if not yesterday_file.exists():
|
|
return None
|
|
|
|
content = yesterday_file.read_text()
|
|
lines = [l.strip() for l in content.split('\n') if l.strip() and not l.startswith('#')]
|
|
return lines[:5] # First 5 non-header lines
|
|
|
|
def get_inbox_items():
|
|
"""Check inbox for pending items."""
|
|
inbox_dir = WORKSPACE / "inbox"
|
|
if not inbox_dir.exists():
|
|
return []
|
|
|
|
items = []
|
|
for f in inbox_dir.iterdir():
|
|
if f.is_file() and not f.name.startswith('.'):
|
|
items.append(f.name)
|
|
return items
|
|
|
|
def get_clips_recent():
|
|
"""Get recent clips."""
|
|
clips_file = WORKSPACE / "docs" / "clips.json"
|
|
if not clips_file.exists():
|
|
return []
|
|
|
|
try:
|
|
with open(clips_file) as f:
|
|
clips = json.load(f)
|
|
return clips[:3]
|
|
except:
|
|
return []
|
|
|
|
def generate_briefing():
|
|
"""Generate the morning briefing."""
|
|
now = datetime.now()
|
|
|
|
lines = []
|
|
lines.append(f"# 📋 Briefing - {now.strftime('%A, %B %d, %Y')}")
|
|
lines.append(f"Generated at {now.strftime('%H:%M')}")
|
|
lines.append("")
|
|
|
|
# Tasks
|
|
tasks = get_tasks_summary()
|
|
if tasks:
|
|
lines.append("## 🎯 Tasks")
|
|
if tasks['in_progress']:
|
|
lines.append(f"**In Progress ({len(tasks['in_progress'])}):**")
|
|
for t in tasks['in_progress'][:3]:
|
|
lines.append(f" • {t[:60]}...")
|
|
if tasks['waiting']:
|
|
lines.append(f"**Waiting ({len(tasks['waiting'])}):** {len(tasks['waiting'])} items")
|
|
if tasks['inbox']:
|
|
lines.append(f"**Inbox ({len(tasks['inbox'])}):** {len(tasks['inbox'])} items to triage")
|
|
lines.append("")
|
|
|
|
# Yesterday
|
|
yesterday = get_yesterday_notes()
|
|
if yesterday:
|
|
lines.append("## 📝 Yesterday")
|
|
for note in yesterday[:3]:
|
|
lines.append(f" • {note[:60]}")
|
|
lines.append("")
|
|
|
|
# Inbox
|
|
inbox = get_inbox_items()
|
|
if inbox:
|
|
lines.append("## 📬 Inbox")
|
|
lines.append(f"{len(inbox)} items waiting: {', '.join(inbox[:3])}")
|
|
lines.append("")
|
|
|
|
# Clips
|
|
clips = get_clips_recent()
|
|
if clips:
|
|
lines.append("## 📎 Recent Clips")
|
|
for clip in clips:
|
|
lines.append(f" • {clip.get('title', 'Untitled')}")
|
|
lines.append("")
|
|
|
|
lines.append("---")
|
|
lines.append("*What's the focus today?*")
|
|
|
|
return "\n".join(lines)
|
|
|
|
def main():
|
|
briefing = generate_briefing()
|
|
print(briefing)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|