208 lines
5.6 KiB
Python
Executable File
208 lines
5.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
wisdom - Collect and recall quotes, ideas, and wisdom
|
|
|
|
Store things worth remembering and get random inspiration.
|
|
"""
|
|
|
|
import json
|
|
import random
|
|
import sys
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
WORKSPACE = Path("/home/wdjones/.openclaw/workspace")
|
|
WISDOM_FILE = WORKSPACE / "data" / "wisdom.json"
|
|
|
|
CATEGORIES = {
|
|
'quote': '💬',
|
|
'idea': '💡',
|
|
'lesson': '📚',
|
|
'principle': '⚖️',
|
|
'reminder': '🔔',
|
|
'goal': '🎯',
|
|
}
|
|
|
|
def load_wisdom() -> list:
|
|
"""Load wisdom entries."""
|
|
WISDOM_FILE.parent.mkdir(parents=True, exist_ok=True)
|
|
if WISDOM_FILE.exists():
|
|
with open(WISDOM_FILE) as f:
|
|
return json.load(f)
|
|
return []
|
|
|
|
def save_wisdom(entries: list):
|
|
"""Save wisdom entries."""
|
|
with open(WISDOM_FILE, 'w') as f:
|
|
json.dump(entries, f, indent=2)
|
|
|
|
def add(text: str, category: str = 'quote', source: str = None, tags: list = None):
|
|
"""Add a new wisdom entry."""
|
|
entries = load_wisdom()
|
|
|
|
entry = {
|
|
'id': len(entries) + 1,
|
|
'text': text,
|
|
'category': category if category in CATEGORIES else 'quote',
|
|
'source': source,
|
|
'tags': tags or [],
|
|
'added': datetime.now().isoformat(),
|
|
'views': 0,
|
|
}
|
|
|
|
entries.append(entry)
|
|
save_wisdom(entries)
|
|
|
|
emoji = CATEGORIES.get(category, '💬')
|
|
print(f"{emoji} Added #{entry['id']}: {text[:50]}...")
|
|
|
|
def random_wisdom(category: str = None):
|
|
"""Get a random piece of wisdom."""
|
|
entries = load_wisdom()
|
|
|
|
if not entries:
|
|
print("No wisdom yet. Add some with: wisdom add <text>")
|
|
return
|
|
|
|
if category:
|
|
entries = [e for e in entries if e['category'] == category]
|
|
if not entries:
|
|
print(f"No entries in category: {category}")
|
|
return
|
|
|
|
entry = random.choice(entries)
|
|
entry['views'] += 1
|
|
save_wisdom(load_wisdom()) # Update view count
|
|
|
|
show_entry(entry)
|
|
|
|
def show_entry(entry: dict):
|
|
"""Display a wisdom entry nicely."""
|
|
emoji = CATEGORIES.get(entry['category'], '💬')
|
|
|
|
print()
|
|
print("─" * 50)
|
|
print(f"{emoji} {entry['text']}")
|
|
if entry.get('source'):
|
|
print(f" — {entry['source']}")
|
|
print("─" * 50)
|
|
|
|
tags = ' '.join(f"#{t}" for t in entry.get('tags', []))
|
|
if tags:
|
|
print(f" {tags}")
|
|
print()
|
|
|
|
def list_wisdom(category: str = None, limit: int = 10):
|
|
"""List wisdom entries."""
|
|
entries = load_wisdom()
|
|
|
|
if category:
|
|
entries = [e for e in entries if e['category'] == category]
|
|
|
|
if not entries:
|
|
print("No wisdom found")
|
|
return
|
|
|
|
print(f"\n📚 Wisdom Collection ({len(entries)} entries)\n")
|
|
|
|
for entry in entries[-limit:]:
|
|
emoji = CATEGORIES.get(entry['category'], '💬')
|
|
text = entry['text'][:50]
|
|
if len(entry['text']) > 50:
|
|
text += "..."
|
|
print(f" #{entry['id']:3} {emoji} {text}")
|
|
|
|
print()
|
|
|
|
def search_wisdom(query: str):
|
|
"""Search wisdom entries."""
|
|
entries = load_wisdom()
|
|
query_lower = query.lower()
|
|
|
|
matches = []
|
|
for entry in entries:
|
|
searchable = f"{entry['text']} {entry.get('source', '')} {' '.join(entry.get('tags', []))}".lower()
|
|
if query_lower in searchable:
|
|
matches.append(entry)
|
|
|
|
if not matches:
|
|
print(f"No matches for: {query}")
|
|
return
|
|
|
|
print(f"\n🔍 Found {len(matches)} matches:\n")
|
|
for entry in matches:
|
|
emoji = CATEGORIES.get(entry['category'], '💬')
|
|
print(f" #{entry['id']} {emoji} {entry['text'][:50]}...")
|
|
print()
|
|
|
|
def daily():
|
|
"""Show the daily wisdom (same one each day, changes daily)."""
|
|
entries = load_wisdom()
|
|
|
|
if not entries:
|
|
print("No wisdom yet. Add some with: wisdom add <text>")
|
|
return
|
|
|
|
# Use the date as seed for consistent daily selection
|
|
day_seed = int(datetime.now().strftime("%Y%m%d"))
|
|
random.seed(day_seed)
|
|
entry = random.choice(entries)
|
|
random.seed() # Reset seed
|
|
|
|
print("\n🌅 Today's Wisdom:")
|
|
show_entry(entry)
|
|
|
|
def main():
|
|
if len(sys.argv) < 2:
|
|
print("Usage:")
|
|
print(" wisdom - Random wisdom")
|
|
print(" wisdom daily - Today's wisdom")
|
|
print(" wisdom add <text> - Add wisdom")
|
|
print(" wisdom add -c quote <text> - Add with category")
|
|
print(" wisdom add -s 'Author' <text> - Add with source")
|
|
print(" wisdom list [category] - List entries")
|
|
print(" wisdom search <query> - Search")
|
|
print("")
|
|
print(f"Categories: {', '.join(CATEGORIES.keys())}")
|
|
|
|
# Show random by default
|
|
random_wisdom()
|
|
return
|
|
|
|
cmd = sys.argv[1]
|
|
|
|
if cmd == 'daily':
|
|
daily()
|
|
elif cmd == 'add' and len(sys.argv) > 2:
|
|
# Parse arguments
|
|
args = sys.argv[2:]
|
|
category = 'quote'
|
|
source = None
|
|
|
|
# Check for flags
|
|
while args and args[0].startswith('-'):
|
|
if args[0] == '-c' and len(args) > 1:
|
|
category = args[1]
|
|
args = args[2:]
|
|
elif args[0] == '-s' and len(args) > 1:
|
|
source = args[1]
|
|
args = args[2:]
|
|
else:
|
|
args = args[1:]
|
|
|
|
text = ' '.join(args)
|
|
add(text, category, source)
|
|
|
|
elif cmd == 'list':
|
|
category = sys.argv[2] if len(sys.argv) > 2 else None
|
|
list_wisdom(category)
|
|
|
|
elif cmd == 'search' and len(sys.argv) > 2:
|
|
search_wisdom(' '.join(sys.argv[2:]))
|
|
|
|
else:
|
|
random_wisdom()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|