25 KiB
25 KiB
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! ✅