#!/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 ") 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 ") 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 - Add wisdom") print(" wisdom add -c quote - Add with category") print(" wisdom add -s 'Author' - Add with source") print(" wisdom list [category] - List entries") print(" wisdom search - 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()