Files
mailadler/PROJEKT_MANAGEMENT_SYSTEM.md
2026-02-04 02:47:35 +01:00

25 KiB
Raw Permalink Blame History

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

#!/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:

# 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

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)

# 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

# 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

# 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!