#!/usr/bin/env python3 """ Quick Start - One-liner topic monitoring setup. """ import sys import argparse import re import json from pathlib import Path from datetime import datetime sys.path.insert(0, str(Path(__file__).parent)) try: from config import load_config, save_config, CONFIG_FILE except ImportError: CONFIG_FILE = Path(__file__).parent.parent / "config.json" def load_config(): if CONFIG_FILE.exists(): with open(CONFIG_FILE) as f: return json.load(f) return {"topics": [], "settings": {}} def save_config(config): with open(CONFIG_FILE, 'w') as f: json.dump(config, f, indent=2) def generate_id(name: str) -> str: topic_id = name.lower() topic_id = re.sub(r'[^\w\s-]', '', topic_id) topic_id = re.sub(r'[-\s]+', '-', topic_id) return topic_id.strip('-')[:30] def split_csv(value: str): if not value: return [] return [item.strip() for item in value.split(",") if item.strip()] def quick_add(args): config = load_config() topic_id = generate_id(args.topic) existing_ids = [t.get("id") for t in config.get("topics", [])] if topic_id in existing_ids: print(f"⚠️ Topic '{topic_id}' already exists. Use manage_topics.py to edit.") sys.exit(1) query = args.query or f"{args.topic} news updates" if args.keywords: keywords = split_csv(args.keywords) else: words = re.findall(r'\b[A-Za-z]{3,}\b', args.topic) keywords = list(dict.fromkeys(words))[:5] topic = { "id": topic_id, "name": args.topic, "query": query, "keywords": keywords, "feeds": split_csv(args.feeds), "github_repos": split_csv(args.github_repos), "exclude_keywords": split_csv(args.exclude_keywords), "required_keywords": split_csv(args.required_keywords), "frequency": args.frequency, "importance_threshold": args.importance, "channels": [args.channel], "context": args.context or f"Monitoring {args.topic}", "alert_on": ["github_release"] if args.github_repos else [], "alert_on_sentiment_shift": args.alert_on_sentiment_shift, "created": datetime.now().isoformat(), } config.setdefault("topics", []).append(topic) config.setdefault("settings", { "digest_day": "sunday", "digest_time": "18:00", "max_alerts_per_day": 5, "deduplication_window_hours": 72, }) save_config(config) print() print("✅ Topic created!") print() print(f" 📌 {args.topic}") print(f" 🔍 Query: {query or '—'}") print(f" 🏷️ Keywords: {', '.join(keywords) or '—'}") if topic['feeds']: print(f" 📰 Feeds: {', '.join(topic['feeds'])}") if topic['github_repos']: print(f" 🚀 GitHub repos: {', '.join(topic['github_repos'])}") print(f" ⏰ Frequency: {args.frequency}") print(f" 🔔 Alert threshold: {args.importance}") print(f" 📱 Channel: {args.channel}") print() print("Next steps:") print(f" • Test: python3 scripts/monitor.py --topic {topic_id} --dry-run --verbose") print(f" • Run: python3 scripts/monitor.py --topic {topic_id}") print(f" • Edit: python3 scripts/manage_topics.py edit {topic_id} --frequency hourly") print(f" • Remove: python3 scripts/manage_topics.py remove {topic_id}") print() return topic_id def main(): parser = argparse.ArgumentParser(description="Quick Start - Add a topic to monitor in one command") parser.add_argument("topic", help="Topic name to monitor") parser.add_argument("--query", "-q", help="Custom search query") parser.add_argument("--keywords", "-k", help="Comma-separated keywords to watch for") parser.add_argument("--feeds", help="Comma-separated RSS/Atom feed URLs") parser.add_argument("--github-repos", help="Comma-separated owner/repo values for release monitoring") parser.add_argument("--exclude-keywords", help="Comma-separated keywords to filter out") parser.add_argument("--required-keywords", help="Comma-separated keywords that must all appear") parser.add_argument("--frequency", "-f", choices=["hourly", "daily", "weekly"], default="daily") parser.add_argument("--importance", "-i", choices=["high", "medium", "low"], default="medium") parser.add_argument("--channel", "-c", default="telegram", help="Where to send alerts") parser.add_argument("--context", help="Why this topic matters to you") parser.add_argument("--alert-on-sentiment-shift", action="store_true", help="Alert when sentiment changes") args = parser.parse_args() quick_add(args) if __name__ == "__main__": main()