193 lines
8.3 KiB
Markdown
193 lines
8.3 KiB
Markdown
# Fahrplan
|
||
|
||
Acht Meilensteine. Jeder endet mit einer lauffähigen Version auf `main`,
|
||
grünen Prüfungen, aktueller Dokumentation und einem Eintrag im DEVLOG.
|
||
|
||
| Meilenstein | Ziel | Status |
|
||
| --------------------------------------- | ---------------------------- | -------- |
|
||
| [M1](#m1--fundament) | Fundament | erledigt |
|
||
| [M2](#m2--aufgaben-und-projekte) | Aufgaben und Projekte | erledigt |
|
||
| [M3](#m3--kalender-lesen) | Kalender lesen | erledigt |
|
||
| [M4](#m4--wochenplanung-und-zeitblöcke) | Wochenplanung und Zeitblöcke | erledigt |
|
||
| [M5](#m5--benachrichtigungen) | Benachrichtigungen | erledigt |
|
||
| [M6](#m6--integrationen) | Integrationen | erledigt |
|
||
| [M7](#m7--schnellerfassung-und-api) | Schnellerfassung und API | erledigt |
|
||
| [M8](#m8--mcp) | MCP | erledigt |
|
||
|
||
---
|
||
|
||
## M1 – Fundament
|
||
|
||
**Erledigt am 10.09.2026 mit Version 0.1.0.**
|
||
|
||
**Ziel:** Ein angemeldeter, betreibbarer Rumpf. Noch keine Aufgaben, kein
|
||
Kalender — aber alles, worauf die späteren Meilensteine aufsetzen.
|
||
|
||
- [x] Projektgerüst: Next 16, React 19, TypeScript strict, Tailwind 4
|
||
- [x] `npm run pruefen`: Prettier, ESLint, tsc, Vitest, ShellCheck
|
||
- [x] Datenmodell für Anmeldung, Passkeys, Bereiche und Audit
|
||
- [x] Anmeldung über OIDC, Passkey und wahlweise Passwort
|
||
- [x] Rollen `BENUTZER` und `ADMIN`, serverseitig in Seite **und** Server Action
|
||
- [x] Audit-Eintrag je schreibender Aktion, Details werden gesäubert
|
||
- [x] Instanzsteuerung `INSTANZ=firma|daheim` mit 404 statt Hinweis
|
||
- [x] Bereiche verwalten: Farbe, Arbeitsfenster, Tageskapazität
|
||
- [x] Protokollseite für die Verwaltung
|
||
- [x] `/api/health` mit Status, Version und Instanz
|
||
- [x] Dockerfile, Compose-Stapel mit eigenem Migrationsdienst
|
||
- [x] `backup.sh`, `update.sh`, `scripts/release.sh`, `scripts/zeit.sh`
|
||
- [x] Unit-, Integrations-, Migrations- und E2E-Tests
|
||
- [x] Screenshot-Kette mit eigener Wegwerf-Instanz
|
||
- [x] README, Schnellstart, Handbuch, CHANGELOG, DEVLOG
|
||
|
||
**Bewusst verschoben:** `Aufgabe` und `Zeitblock` kommen mit M2 und M4,
|
||
`Kalenderkonto` mit M3 — jeweils mit den Feldern, die der Provider dann
|
||
wirklich braucht, statt heute geraten.
|
||
|
||
## M2 – Aufgaben und Projekte
|
||
|
||
**Erledigt am 10.09.2026 mit Version 0.2.0.**
|
||
|
||
**Ziel:** Alles erfassen und wiederfinden, noch ohne Kalender.
|
||
|
||
- [x] `Aufgabe` mit Typ, Status, Priorität, Aufwand, Fälligkeit, Quelle
|
||
- [x] Eindeutigkeit `[quelle, quelleRef]`, Integrationen upserten
|
||
- [x] Inbox: schnell erfassen, später einsortieren
|
||
- [x] Ideen getrennt von Aufgaben
|
||
- [x] Projekte mit Arbeitspaketen und Meilensteinen
|
||
- [x] Listen mit Filtern nach Bereich, Status und Fälligkeit
|
||
- [x] Handbuchseiten und Bilder
|
||
|
||
**Bewusst offen gelassen:** Kein Wiederholungsrhythmus für Aufgaben und keine
|
||
Verknüpfung von Aufgaben untereinander — beides steht unter „Ideen für
|
||
später" und wartet darauf, ob es im Alltag wirklich fehlt.
|
||
|
||
## M3 – Kalender lesen
|
||
|
||
**Erledigt am 10.09.2026 mit Version 0.3.0.**
|
||
|
||
**Ziel:** Termine aus Microsoft 365 und Google sehen.
|
||
|
||
- [x] `Kalenderkonto` mit Anbieter, Tokens und Delta-Verweis
|
||
- [x] OAuth-Verbindung je Instanz: Graph immer, Google nur daheim
|
||
- [x] Graph-Delta-Sync und Google-Sync über `fetch`, Antworten mit zod geprüft
|
||
- [x] Ganztägige Termine zählen nicht zur Belegung
|
||
- [x] Anonymisierte Beispielantworten in `test/fixtures/`
|
||
- [x] Hintergrundjob mit node-cron
|
||
|
||
## M4 – Wochenplanung und Zeitblöcke
|
||
|
||
**Erledigt am 11.09.2026 mit Version 0.4.0.**
|
||
|
||
**Ziel:** Aufgaben per Ziehen und Ablegen in den Kalender schreiben — und
|
||
Verschiebungen von dort zurückholen.
|
||
|
||
- [x] `Zeitblock` an genau einer Aufgabe und einem Kalenderkonto
|
||
- [x] Wochenansicht mit `@dnd-kit/core`
|
||
- [x] Schreiben in den Kalender, Rückweg beim Verschieben
|
||
- [x] Schleifenschutz über `hash = sha256(startISO|endeISO)`
|
||
- [x] Konflikte: der Kalender gewinnt (HTTP 412 auf If-Match)
|
||
- [x] Belegung gegen die Tageskapazität des Bereichs
|
||
|
||
**Bewusst offen gelassen:** Die Dauer lässt sich nicht am Balken ziehen, und
|
||
ein Zeitblock landet immer im ersten verbundenen Kalender. Beides steht unter
|
||
"Ideen für später" — erst zeigt der Alltag, ob es wirklich fehlt.
|
||
|
||
## M5 – Benachrichtigungen
|
||
|
||
**Erledigt am 11.09.2026 mit Version 0.5.0.**
|
||
|
||
**Ziel:** Sagen, was ansteht — und dabei so selten stören, dass niemand auf
|
||
die Idee kommt, alles abzuschalten.
|
||
|
||
- [x] Web-Push mit `web-push`, Anmeldung je Browser
|
||
- [x] Tagesüberblick per E-Mail über nodemailer
|
||
- [x] Erinnerungen an Fälligkeiten und vor Zeitblöcken, Jobs über node-cron
|
||
- [x] Je Benutzer einstellbar, mit Ruhezeiten über Mitternacht
|
||
- [x] Wiederholungssperre je Anlass, Sache und Tag
|
||
- [x] Abgleichfehler erst nach mehreren Versuchen hintereinander
|
||
|
||
**Bewusst offen gelassen:** Keine Sammelmeldung mehrerer Anlässe in einer
|
||
Nachricht und kein Nachholen dessen, was in die Ruhezeit fiel. Eine
|
||
Erinnerung an einen Zeitblock, der längst begonnen hat, hilft niemandem.
|
||
|
||
## M6 – Integrationen
|
||
|
||
**Erledigt am 12.09.2026 mit Version 0.6.0.**
|
||
|
||
**Ziel:** Aufgaben dort abholen, wo sie entstehen — ohne dass die Planung
|
||
darunter leidet, die hier passiert.
|
||
|
||
- [x] Gemeinsame Aufnahmestelle: jede Integration liefert nur Funde
|
||
- [x] Zammad (nur `firma`), lesend
|
||
- [ ] **Wartungsplaner-API** — Schnittstelle steht noch nicht fest
|
||
- [x] Telegram (nur `daheim`): erfassen, melden, abhaken
|
||
- [x] Spiegel: `firma` sendet, `daheim` empfängt
|
||
- [x] Jede Integration upsertet über `[quelle, quelleRef]`
|
||
|
||
**Offen geblieben:** Der **Wartungsplaner** ist nicht angebunden. Die
|
||
Aufnahmestelle steht bereit und die Seite „Integrationen" führt ihn als
|
||
sichtbare Lücke; es fehlt allein das Abholen, und dafür muss erst feststehen,
|
||
was das Produkt an Schnittstelle hergibt.
|
||
|
||
**Bewusst offen gelassen:** Zammad wird nur gelesen. Ein Ticket schließt man
|
||
im Ticketsystem — sonst weiß die Kollegin nicht, warum es plötzlich zu ist.
|
||
|
||
## M7 – Schnellerfassung und API
|
||
|
||
**Erledigt am 12.09.2026 mit Version 0.7.0.**
|
||
|
||
**Ziel:** Etwas festhalten können, wo man gerade steht — und andere
|
||
Anwendungen hereinlassen, ohne ihnen die Schlüssel zum ganzen Haus zu geben.
|
||
|
||
- [x] Erfassung vom Handy, auch offline
|
||
- [x] Öffentliche API mit Token je Anwendung
|
||
- [x] Rechte je Token, jede schreibende Nutzung im Protokoll
|
||
- [x] Als App ablegbar (Manifest, eigenes Symbol)
|
||
|
||
**Offen geblieben:** Die Bilder der Erfassungsseite im Handbuch zeigen noch
|
||
eine falsche Inbox-Zahl; der Fehler selbst ist behoben, nur der Bildlauf
|
||
kam danach nicht mehr durch.
|
||
|
||
**Bewusst offen gelassen:** Die Schnittstelle kann keine Bereiche, Projekte
|
||
oder Zeitblöcke anfassen und nichts löschen. Was von außen kommt, landet in
|
||
der Inbox; die Einordnung bleibt bei dem, der plant. Auch eine Begrenzung der
|
||
Aufrufzahl gibt es nicht — bei einer Handvoll eigener Tokens wäre sie mehr
|
||
Zeremonie als Schutz.
|
||
|
||
## M8 – MCP
|
||
|
||
**Erledigt am 13.09.2026 mit Version 0.8.0.**
|
||
|
||
**Ziel:** Ein Sprachmodell soll den Alltag erleichtern können — ohne einen
|
||
eigenen, weicheren Zugang zu bekommen als jede andere fremde Anwendung.
|
||
|
||
- [x] MCP-Server über `@modelcontextprotocol/sdk`
|
||
- [x] Lesen und Anlegen von Aufgaben und Zeitblöcken
|
||
- [x] Rechte wie bei der API, jede schreibende Nutzung im Protokoll
|
||
- [x] Werkzeugliste richtet sich nach den Rechten des Tokens
|
||
|
||
**Bewusst offen gelassen:** Der Server kann nichts löschen, keine Bereiche
|
||
oder Projekte anlegen und keine Einstellungen anfassen. Ein Modell soll den
|
||
Alltag erleichtern, nicht die Ordnung umbauen.
|
||
|
||
---
|
||
|
||
## Ideen für später
|
||
|
||
- Auswertung: wie viel Zeit ging tatsächlich in welchen Bereich
|
||
- Wiederkehrende Aufgaben mit eigenem Rhythmus
|
||
- Vorlagen für wiederkehrende Projekte
|
||
- Verknüpfung von Aufgaben untereinander (blockiert, gehört zu)
|
||
- Export der eigenen Daten als JSON
|
||
|
||
## Bewusst nicht geplant
|
||
|
||
- **Wiederkehrende Wartungsaufgaben mit Nachweispflicht.** Die bleiben im
|
||
Wartungsplaner. Der Planer liest nur Fälligkeiten über dessen API.
|
||
- **Mehrbenutzerbetrieb mit geteilten Aufgaben.** Der Planer ist für eine
|
||
Person gedacht; Kollegen melden sich in der Firmeninstanz nur an ihren
|
||
eigenen Daten an.
|
||
- **Eigene Kalenderdarstellung als Ersatz für Outlook.** Der Planer schreibt
|
||
in die vorhandenen Kalender, er ersetzt sie nicht.
|
||
- **Zeiterfassung zur Abrechnung.** Dafür gibt es andere Werkzeuge.
|