# Mail-Adler Projekt-Management System ## 1. Überblick: Task Lifecycle (PRAGMATISCH - KEINE Zeitplanung!) ``` ┌─────────────────────────────────────────────────────────┐ │ Task erstellen (von wem auch immer!) │ │ ├─ Title + Beschreibung │ │ ├─ Priorität: 1 (niedrig) bis 5 (höchst) │ │ └─ [Externe Task?] Fertigstellungsdatum │ ├─────────────────────────────────────────────────────────┤ │ Duplikat-Check │ │ └─ System warnt: "Ähnliche Task existiert schon" │ ├─────────────────────────────────────────────────────────┤ │ Task wartet (offen) │ │ └─ Nach Dringlichkeit sortiert in Daily Mail │ ├─────────────────────────────────────────────────────────┤ │ AUTO-ASSIGN: Georg/Developer übernimmt │ │ ├─ Status → "In Arbeit" │ │ └─ (Wenn eine Task fertig wird → nächste dringste) │ ├─────────────────────────────────────────────────────────┤ │ Task fertig │ │ ├─ Status → "Erledigt" │ │ ├─ AUTO-ASSIGN nächste dringste Task │ │ └─ Tägliche Mail zeigt Updates │ └─────────────────────────────────────────────────────────┘ ``` **WICHTIG: KEINE Zeitplanung! Nur nach Prio arbeiten!** --- ## 2. Task-Eingabe Template (Wie man gute Aufgaben stellt) ### Checklist für gute Task-Beschreibung ``` TITEL (kurz, prägnant) └─ Max 10 Wörter └─ Beispiel: "IMAP Login mit 2FA implementieren" BESCHREIBUNG (strukturiert) ├─ Was: Kurze Zusammenfassung (2-3 Sätze) ├─ Warum: Geschäftliche Begründung ├─ Anforderungen: │ ├─ [ ] Spezifische Anforderung 1 │ ├─ [ ] Spezifische Anforderung 2 │ └─ [ ] Spezifische Anforderung 3 ├─ Akzeptanzkriterien: │ ├─ [ ] Funktioniert mit GMX │ ├─ [ ] Funktioniert mit Web.de │ ├─ [ ] Tests grün │ └─ [ ] Code-Review bestanden ├─ Links & Kontext: │ ├─ GitHub Issue: #123 │ ├─ Design-Doc: link │ └─ Abhängigkeiten: Task #456 ├─ Geschätzte Dauer: 8h / 1 Tag / 1 Woche ├─ Labels: bug, feature, documentation, critical └─ Dringlichkeit: Heute / Diese Woche / Später BEISPIEL (GUTE Task): ─────────────────────────────── IMAP Login mit 2FA implementieren WAS: Füge Two-Factor Authentication zu IMAP-Login hinzu für GMX & Telekom-Konten WARUM: Benutzer mit 2FA können sich sonst nicht anmelden → Frustration ANFORDERUNGEN: - [ ] Support für: GMX, Telekom (Google später - Phase D) - [ ] IMAP-Authentifizierung mit App-Passwort - [ ] Fehlerbehandlung: Falsche Kredentiale - [ ] Security: Passwörter verschlüsselt speichern AKZEPTANZKRITERIEN: - [ ] Benutzer mit 2FA kann sich anmelden - [ ] Fehlermeldung bei falschen Daten klar - [ ] App-Passwort wird korrekt in Keychain gespeichert - [ ] Tests bestanden (unit + integration) - [ ] Code-Review ok LINKS: - Abhängig: Task #340 (IMAP Core) - Design: https://github.com/georg0480/mailadler/wiki/2FA - Dokument: docs/2fa-implementation.md DAUER: 16 Stunden (2 Arbeitstage) LABELS: feature, security DRINGLICHKEIT: Diese Woche ─────────────────────────────── ``` --- ## 3. Duplikat-Prevention System ### Automatische Duplikat-Erkennung ```python #!/usr/bin/env python3 # tools/task_duplicate_checker.py import difflib from database import Database class TaskDuplicateChecker: def __init__(self): self.db = Database() def check_duplicate(self, new_title: str, new_description: str) -> dict: """ Prüfe ob Task ähnlich existiert Return: {"is_duplicate": bool, "similar_tasks": [...]} """ existing_tasks = self.db.get_open_tasks() similar_tasks = [] for task in existing_tasks: # Title Similarity (80%+) title_ratio = difflib.SequenceMatcher( None, new_title.lower(), task['title'].lower() ).ratio() # Description Similarity (70%+) desc_ratio = difflib.SequenceMatcher( None, new_description.lower(), task['description'].lower() ).ratio() if title_ratio > 0.80 or desc_ratio > 0.70: similar_tasks.append({ "id": task['id'], "title": task['title'], "status": task['status'], "similarity": max(title_ratio, desc_ratio), "assigned_to": task['assigned_to'] }) return { "is_duplicate": len(similar_tasks) > 0, "similar_tasks": sorted( similar_tasks, key=lambda x: x['similarity'], reverse=True )[:3] # Top 3 ähnliche } def warn_before_create(self, new_title: str, new_description: str): """ Vor Task-Erstellung warnen """ result = self.check_duplicate(new_title, new_description) if result['is_duplicate']: print("\n⚠️ WARNUNG: Ähnliche Tasks existieren bereits!\n") for task in result['similar_tasks']: print(f"Task #{task['id']}: {task['title']}") print(f" Status: {task['status']}") print(f" Ähnlichkeit: {task['similarity']*100:.0f}%") print(f" Zugeordnet: {task['assigned_to'] or 'Niemand'}\n") response = input("Trotzdem neue Task erstellen? (ja/nein): ") return response.lower() == 'ja' return True ``` ### UI: Duplikat-Warnung ``` Neue Task eintippen: Titel: "IMAP Login implementieren" ↓ System prüft Duplikate... ↓ ⚠️ ÄHNLICHE TASKS GEFUNDEN: [1] Task #456: "IMAP-Verbindung implementieren" Status: In Arbeit (Developer: Alice) Ähnlichkeit: 85% [2] Task #389: "IMAP Authentifizierung" Status: Code-Review (Developer: Bob) Ähnlichkeit: 72% 💡 Tipp: Vielleicht schon eine Task für dein Anliegen offen? [Trotzdem erstellen] [Task #456 anschauen] ``` --- ## 4. Auto-Assign System (AUTOMATISCH nächste dringste Task!) ### Wie es funktioniert: ```python # tools/auto_assign.py class AutoAssign: def on_task_completed(self, task_id: str): """ Wenn Task fertig → nächste dringste AUTO-ASSIGN! """ # 1. Mark Task als DONE self.db.update_task(task_id, status="DONE") # 2. Finde Developer der diese Task hatte developer = self.db.get_task_assignee(task_id) # 3. Finde nächste dringste offene Task next_task = self.db.get_highest_priority_open_task() if next_task: # 4. AUTO-ASSIGN an selben Developer self.db.assign_task(next_task['id'], developer) # 5. Mail an Developer self.send_mail(developer, f"Neue Task #{next_task['id']} auto-assigned: {next_task['title']}") # 6. Mail an alle (täglich email wird aktualisiert) return True return False ``` ### Workflow: ``` Georg arbeitet an Task #501 (Prio 5) ↓ Georg: "DONE #501" (Reply zu Daily Mail) ↓ System: 1. Task #501 → Status DONE 2. Finde nächste dringste: Task #512 (Prio 5, offen) 3. AUTO-ASSIGN #512 → Georg 4. Mail: "Georg, neue Task #512 assigned!" 5. Morgen Daily Mail zeigt: Georg arbeitet an #512 ``` **WICHTIG: MAX 1 Task pro Developer gleichzeitig!** --- ## 5. Dringlichkeits-Verarbeitung (Task-Reihenfolge) ### Sortierungs-Algorithmus ```python def get_tasks_by_urgency(self) -> list: """ Sortiere Tasks nach Dringlichkeit Priorität: 1. Tasks mit Deadline heute (CRITICAL) 2. Tasks mit Deadline diese Woche (HIGH) 3. Tasks ohne Deadline (NORMAL) 4. In gleicher Kategorie: Nach Erstellungsdatum (älter zuerst) 5. Gleiches Datum: Nach Stimmen/Upvotes (mehr = höher) """ tasks = self.db.get_open_tasks() def priority_score(task): days_until = (task['deadline'] - datetime.now()).days # Basis-Score nach Deadline if days_until == 0: base_score = 1000 # HEUTE = höchste Priorität elif days_until <= 7: base_score = 500 # Diese Woche elif days_until <= 30: base_score = 100 # Diesen Monat else: base_score = 10 # Später # Zusatz-Punkte: Upvotes/Stimmen upvotes = len(task.get('upvoted_by', [])) upvote_bonus = upvotes * 5 # Zusatz-Punkte: Alter (älter = wichtiger) days_old = (datetime.now() - task['created_at']).days age_bonus = days_old * 0.1 # Zusatz-Punkte: Label "CRITICAL" label_bonus = 100 if 'critical' in task.get('labels', []) else 0 return base_score + upvote_bonus + age_bonus + label_bonus # Sortiere nach Score return sorted(tasks, key=priority_score, reverse=True) ``` ### Gleiche Dringlichkeit: Team-Abstimmung ``` Task #456: IMAP Login [DEADLINE: Morgen] Task #389: 2FA Support [DEADLINE: Morgen] Beide EQUAL dringend! 🎯 TEAM-ABSTIMMUNG: ├─ Alice: 👍 (Task #456) ├─ Bob: 👍 (Task #456) └─ Charlie: 👍 (Task #389) → Task #456 gewinnt (2 Stimmen) → Task #389 wird 2. Priorität Alle Developer können **einmal** pro Task abstimmen ``` --- ## 6. External Developer: Onboarding & Feedback ### Guter Onboarding (Schnelle Einarbeitung) ```markdown # EXTERNAL DEVELOPER ONBOARDING ## Willkommen! 🎉 Du hast Task #456: "IMAP Login" übernommen? Hier alles was du brauchst: ### 1️⃣ SETUP (15 Min) - [ ] Repository geklont - [ ] Abhängigkeiten: `pip install -r requirements.txt` - [ ] Tests: `pytest src/` → Alle grün? - [ ] Local Run: `python main.py` ### 2️⃣ CODE-KONTEXT (30 Min) - Relevant Files: * `src/imap/client.py` - IMAP Core * `src/auth/login.py` - Login Flow * `src/security/credentials.py` - Secure Speicherung - Design Docs: * https://github.com/.../wiki/IMAP-Architecture * https://github.com/.../docs/2fa-implementation.md - Video (5 Min): https://youtube.com/watch?v=... "IMAP Login Walkthrough" ### 3️⃣ ANFORDERUNGEN CHECKLIST - [ ] Support GMX & Web.de - [ ] 2FA mit App-Passwort - [ ] Error Handling klar - [ ] Tests schreiben - [ ] Code-Review bestehen ### 4️⃣ QUESTIONS? - Slack: @Georg (aufpassen, bin oft busy!) - Email: georg.dahmen@proton.me - GitHub Discussions: github.com/.../discussions - TRY FIRST: Suche nach ähnlichen Issues ### 5️⃣ WHEN DONE - Push zu Branch: `feature/imap-login-2fa` - Create Pull Request (schreibe gute Description!) - Antworte auf Code-Review Kommentare --- ## Success Path 🚀 Wenn alles läuft: 1. Du behältst **positives Feedback** für dein Profil 2. Wir können dich für **weitere Tasks** anfragen 3. Du wirst **Community Contributor** 4. Long-term: Vielleicht Team-Member? --- ### Still Stuck? - GitHub Issue erstellen: https://github.com/.../issues/new - Tag @Georg in Discussions - Wir helfen! 💪 ``` --- ## 7. Developer Deadline Reminders (Automatisch) ### Email Sequenz ``` DAY 0: Developer übernimmt Task ──────────────────────────── Hallo Alice! 👋 Du hast gerade Task #456 übernommen: "IMAP Login mit 2FA" Deadline: 28 Tage (4 Wochen) Fällig: 2025-03-03 Viel Erfolg! 💪 DAY 14: Erinnerung 1 ──────────────────── Hallo Alice! ⏰ ERINNERUNG: Task #456 läuft noch... Task: "IMAP Login mit 2FA" Status: In Arbeit (seit 14 Tagen) Deadline: 2025-03-03 (noch 14 Tage) 💡 Falls du Hilfe brauchst: - Slack @Georg - GitHub Discussions Weiter so! 👍 DAY 21: Erinnerung 2 ──────────────────── Hallo Alice! ⏰ WICHTIG: Task #456 läuft noch... Task: "IMAP Login mit 2FA" Status: In Arbeit (seit 21 Tagen) Deadline: 2025-03-03 (noch 7 Tage!) Du brauchst wahrscheinlich Hilfe? Sag Bescheid! Sonst wird die Task am 2025-03-03 freigegeben. DAY 28: Task Deadline erreicht ──────────────────────────────── Hallo Alice, ⚠️ TASK DEADLINE ERREICHT! Task #456: "IMAP Login mit 2FA" Status: IN ARBEIT → FREIGEGEBEN (Deadline überschritten) Die Task wird jetzt wieder für andere Developer verfügbar. Was ist passiert? - Zu komplex? - Andere Prioritäten? - Blockiert? Schreib uns! Wir helfen. 💪 Falls du die Task weitermachen willst: → Schreib Comment in GitHub Issue → Oder übernehme Task erneut ``` --- ## 8. Tägliche Mail (09:00 CET) - DEIN exaktes Format! ### Template: Externe + Interne Tasks nach Prio sortiert ``` Betreff: Mail-Adler Daily Tasks - 2025-02-03 Hallo Team! 📨 ═══════════════════════════════════════════════ 📤 EXTERNE TASKS (Fertigstellungsdatum sortiert - früheste ZUERST!) #501 [Prio 5⭐⭐⭐⭐⭐] IMAP Login 2FA Status: IN ARBEIT (Georg) Fertig: 2025-02-05 (MORGEN!) 🔴 ──────────────────────────── #450 [Prio 4⭐⭐⭐⭐] Kalender Integration Status: OFFEN (Nächste Auto-Assign!) Fertig: 2025-02-07 ──────────────────────────── #499 [Prio 3⭐⭐⭐] Bug: Timeout bei Sync Status: OFFEN Fertig: 2025-02-10 ──────────────────────────── ═══════════════════════════════════════════════ 📥 INTERNE TASKS (Nach Prio, dann Dringlichkeit) #512 [Prio 5⭐⭐⭐⭐⭐] Refactor IMAP Client Status: OFFEN Dringlichkeit: HOCH ──────────────────────────── #445 [Prio 4⭐⭐⭐⭐] Unit Tests schreiben Status: OFFEN Dringlichkeit: MITTEL ──────────────────────────── #200 [Prio 2⭐⭐] Dokumentation updaten Status: OFFEN Dringlichkeit: NIEDRIG ──────────────────────────── ═══════════════════════════════════════════════ 🚫 SPAM-FILTER (neue Adressen seit gestern) Diese Adressen wurden in SPAM übernommen: scammer@evil.com, spambot@bulk.ru, phishing@fake.de 📌 WICHTIG: Diese werden bei Empfang DIREKT in dein Spam-Ordner sortiert, damit nicht mehrere Leute sie bekommen! ═══════════════════════════════════════════════ 💬 REPLY ZU DIESER EMAIL - Du kannst: • Neue Task: "NEW: [Title] [Prio 1-5] [Description]" • Prio ändern: "PRIO #501 -> 3" (Prio 5 auf 3 senken) • Task fertig: "DONE #501" Beispiele: ──────────────────────────────────────────────── NEW: Database backup system Prio 4 Implement automated daily backups for PostgreSQL PRIO #450 -> 5 DONE #501 ──────────────────────────────────────────────── --- Automatisch gesendet täglich 09:00 CET KEINE Zeitplanung - nur Prio! Mail-Adler Task Management System ``` --- ## 9. Task-History: Automatische Kontext-Anzeige ### Problem Wenn du eine Task öffnest, weißt du nicht ob es dazu schon frühere Diskussionen, Issues oder Commits gab. Das führt zu: - Doppelter Arbeit - Verlorener Kontext - Unnötiger Suche ### Lösung: Automatische History-Anzeige ```python # tools/task_history.py class TaskHistory: def get_related_context(self, task_title: str, task_description: str) -> dict: """ Finde automatisch relevante Historie zu einer Task """ keywords = self.extract_keywords(task_title + " " + task_description) results = { "github_issues": [], "github_commits": [], "previous_tasks": [], "amp_threads": [] } # 1. GitHub Issues durchsuchen for issue in self.github.search_issues(keywords): results["github_issues"].append({ "number": issue.number, "title": issue.title, "state": issue.state, "url": issue.html_url, "relevance": self.calculate_relevance(issue, keywords) }) # 2. GitHub Commits durchsuchen for commit in self.github.search_commits(keywords): results["github_commits"].append({ "sha": commit.sha[:7], "message": commit.message, "date": commit.date, "url": commit.html_url, "files": commit.files }) # 3. Frühere Tasks durchsuchen for task in self.db.search_tasks(keywords): results["previous_tasks"].append({ "id": task.id, "title": task.title, "status": task.status, "notes": task.notes }) # 4. Amp-Threads durchsuchen (falls vorhanden) for thread in self.search_amp_threads(keywords): results["amp_threads"].append({ "id": thread.id, "summary": thread.summary, "date": thread.date }) return results ``` ### UI: History-Panel bei Task-Ansicht ``` ┌────────────────────────────────────────────────────────┐ │ Task #512: IMAP Login mit 2FA │ ├────────────────────────────────────────────────────────┤ │ Status: OFFEN | Prio: 5 | Erstellt: 2025-02-01 │ ├────────────────────────────────────────────────────────┤ │ │ │ Beschreibung: │ │ Implementiere 2FA Support für GMX und Telekom... │ │ │ ├────────────────────────────────────────────────────────┤ │ 📜 RELEVANTE HISTORIE (automatisch gefunden) │ │ │ │ GitHub Issues: │ │ ├─ #234 "2FA Login funktioniert nicht" (closed) │ │ │ └─ Lösung: App-Passwort statt normales PW │ │ └─ #189 "GMX IMAP Authentifizierung" (closed) │ │ └─ Enthält: Server-Einstellungen für GMX │ │ │ │ Commits: │ │ ├─ a3f82d1 "Add IMAP auth handler" (2025-01-15) │ │ └─ 9c4e2b7 "Fix GMX login timeout" (2025-01-20) │ │ │ │ Frühere Tasks: │ │ └─ #340 "IMAP Core implementieren" (DONE) │ │ └─ Basis für diese Task │ │ │ │ Amp-Threads: │ │ └─ T-019c2360... "IMAP Implementation besprochen" │ │ │ │ [Alle anzeigen] [History ausblenden] │ └────────────────────────────────────────────────────────┘ ``` ### Implementierung: GitHub API ```python # tools/github_history.py import requests class GitHubHistory: def __init__(self, repo: str, token: str): self.repo = repo # "georg0480/mailadler" self.token = token self.headers = {"Authorization": f"token {token}"} def search_issues(self, keywords: list, limit: int = 5) -> list: """ Suche GitHub Issues nach Keywords """ query = " ".join(keywords) + f" repo:{self.repo}" url = f"https://api.github.com/search/issues?q={query}&per_page={limit}" response = requests.get(url, headers=self.headers) return response.json().get("items", []) def search_commits(self, keywords: list, limit: int = 5) -> list: """ Suche Commits nach Keywords in Message """ # Commits API durchsuchen url = f"https://api.github.com/repos/{self.repo}/commits" response = requests.get(url, headers=self.headers) commits = response.json() matched = [] for commit in commits: message = commit["commit"]["message"].lower() if any(kw.lower() in message for kw in keywords): matched.append(commit) if len(matched) >= limit: break return matched ``` ### Öffentlich für alle Die Task-History ist **für alle sichtbar** - nicht nur für den zugewiesenen Developer: - Jeder kann den Kontext sehen - Wissen wird geteilt - Keine doppelte Arbeit --- ## 10. Frustration-Reduktion: Was Fehlt Noch? ### Häufige Probleme & Lösungen | Problem | Aktuell | Lösung | |---------|---------|--------| | **Task-Spam** | Keine | Max 1 gleichzeitig, Task-Liste täglich | | **Verlorene Aufgaben** | Ja | Duplikat-Check, Suchbar | | **Deadline-Überraschungen** | Ja | 3 Reminders (Tag 14, 21, 28) | | **Externe Developer verloren** | Ja | Gute Onboarding + Video | | **Keine Feedback** | Ja | Positives Feedback speichern | | **Keine Priorisierer** | Ja | Developer können selbst priorisieren | | **Zu viele offene Tasks** | Ja | Dringlichkeits-Sortierung | | **Status unklar** | Ja | Tägliche Spam + Status in UI | | **Dev hängt fest** | Ja | Erinnerungen + "Braucht Hilfe?" | | **Viele kleine Aufgaben** | ? | Labels, Grouping, Filter | --- ## 11. Implementation Plan ### MVP (Must-Have) ``` Phase 1 (Woche 1): ├─ Task CRUD (Create, Read, Update, Delete) ├─ Status Tracker (Open, In Progress, Done) ├─ Developer Assignment (max 1 gleichzeitig) └─ Duplikat-Checker Phase 2 (Woche 2): ├─ Deadline Reminders (Day 14, 21, 28) ├─ Priority Sorting (nach Dringlichkeit) ├─ Daily Status Email (09:00 CET) └─ Developer Priorisierung Phase 3 (Woche 3): ├─ External Developer Onboarding ├─ Positive Feedback speichern ├─ Team-Abstimmung für gleiche Dringlichkeit └─ GitHub Integration (Issue ↔ Task) ``` --- ## 12. Zusammenfassung: Dein Task-Management System (PRAGMATISCH!) ``` ✅ AUTOMATISCH (NO ZEITPLANUNG!): • Duplikat-Prüfung vor Erstellung • Tägliche Mail (09:00 CET) • AUTO-ASSIGN nächste dringste Task • Externe Tasks nach Fertigstellungsdatum sortiert • Interne Tasks nach Prio sortiert • Spam-Filter Auto-Übernehmen (verhindert Duplikate) ✅ JEDER KANN MACHEN (via Daily Mail Reply): • Neue Task erstellen: "NEW: [Title] Prio [1-5] [Description]" • Prio ändern: "PRIO #501 -> 3" • Task als fertig: "DONE #501" • Nicht nur Developer! ✅ DATENBANK STRUKTUR: • Task: title, description, priority (1-5) • Externe Tasks: fertigstellungsdatum • Status: OFFEN, IN_ARBEIT, DONE • Spam-Adressen: Auto-Übernehmen bei Empfang ✅ FUNKTIONIERT PRAKTISCH: • Keine theoretische Zeitplanung • Einfache Prio-Nummern (1-5) • Daily Mail zeigt STATUS klar • Auto-Assign verhindert Vergessen • Spam-Handling verhindert Duplikate • Reply-Interface: SUPER einfach ERGEBNIS: - Georg: Weiß täglich was kritisch ist - Developer: Immer genau 1 Task - Team: Keine Duplikate, keine Verwirrung - Spam: Automatisch gefiltert, niemand wird doppelt belästigt ``` **Dein System ist PRAGMATISCH - es funktioniert im echten Leben!** ✅