Format nach Keep a Changelog, ein Abschnitt
pro Paket-Release (Tag <paket>/vX.Y.Z). Jeder Eintrag nennt, was sich ändert
und was ein konsumierendes Tool beim Upgrade tun muss („Migration“) — dieses
Changelog ist die Upgrade-Anleitung für die Tools.
Veraltete Übersetzungen markieren (modulierbar#31, generisch für alle Tools): Wird eine Sprache nach der Übersetzung geändert, gilt die unveränderte Gegensprache als „möglicherweise veraltet“ — sichtbar im Editor, abfragbar im Release-Prozess, per „Als aktuell markieren“ quittierbar. Ändern sich beide Sprachen, wird nichts markiert (bewusste Doppel-Korrektur). Felder ohne aufgezeichneten Sync-Stand (Bestandsdaten) werden nie markiert.
basicbar_integrations.translation_sync(neu):content_hash,record_synced,changed_languages,stale_languages,stale_map,modeltranslation_values. Zustand lebt pro Model in einem vom Tool angelegtenJSONField(eine Zeile + Migration).@basicbar/uiTranslatableField: neue optionale Propsstale(Sprachcodes → amber Tab-Punkt + Hinweiszeile),onMarkSynced(„Als aktuell markieren“) undonTranslated(nach Maschinen- übersetzung — hier den Sync-Stand persistieren). Der Übersetzen-Button erscheint bei veralteten Sprachen auch auf gefülltem Feld (explizites Neu-Übersetzen);TranslationForm-Einträge unterstützenonTranslatedebenfalls („alle Felder übersetzen“ hält den Sync-Stand aktuell, überschreibt aber weiterhin nie gefüllte Felder).
Migration (Adoption ist opt-in — ohne neue Props/Aufrufe ändert sich nichts):
- Model:
translation_sync = models.JSONField(default=dict, blank=True)- Migration.
- Beim Speichern übersetzungsrelevanter Endpunkte bzw. in einem eigenen
„mark synced“-/
onTranslated-Endpunkt:record_synced()aufrufen. - Serializer:
translation_stale = stale_map(instance.translation_sync, {feld: modeltranslation_values(instance, feld, ("de", "en")), …})ausliefern; Frontend reicht es alsstale-Prop durch und ruft beionMarkSynced/onTranslatedden Endpunkt aus Schritt 2. - Release-Checks:
stale_map()über die zu prüfenden Objekte. - Neue Katalog-Schlüssel (de-Übersetzungen ergänzen):
translation may be outdated,The other language was changed since this translation.,Mark as up to date.
- LTI-1.3-Fundament (Phase 5), aus abstimmbar extrahiert:
LtiPlatform/LtiToolKey/LtiUserLink,build_tool_conf,lti_login/lti_jwks, Staff-Platform-API, JIT-Provisionierung mit E-Mail-Unifizierung (Opt-in pro Plattform), Constraint-Namen mit Paket-Präfix (koexistenz- sicher während der Umzugsmigration), Frame-Ancestors-Middleware (LTI_FRAME_PATH_PREFIXESkonfigurierbar). 28 Tests inkl. simuliertem LMS-Handshake. - Bewusst Tool-seitig: Message-Launch, Deep Linking, Kontext-Link-Model (FK auf Fachmodelle) und Icon — komponiert aus den Paket-Primitiven.
- Migration abstimmbar: Daten-Umzugsmigration (
lti/0003) kopiert Plattformen/Keys/User-Links PK-erhaltend in die Paket-Tabellen und hängt den Kontext-Link-FK um — läuft als normalesmanage.py migrate, kein manueller Schritt. - ausleihbar: keine Änderung — die Fähigkeit kommt bei Bedarf über Paket + eigene Launch-App.
- Erstes Auth-Paket (Phase 4):
OIDCBackend(Claim-Mapping, JIT- Provisionierung, IdP-Gruppen → Django-Admin),SilentLoginView, Back-Channel-Logout,provider_logout_url,is_oidc_admin,discovery.discover_endpoints,AbstractBasicUser(ADR-0003). - Die bewussten Tool-Unterschiede aus Phase 0 sind jetzt Konfiguration:
MAX_USERS(Obergrenze;anonymized_at-Konvention zählt anonymisierte Konten nicht) undOIDC_MATCH_BY_USERNAME_FALLBACK(Subject-Drift- Heilung per Username-Match, Default aus). Betreiber-Doku zu Fristen und Kennungs-Wiedervergabe im Paket-README. - 25 Tests (aus beiden Tools portiert und vereinigt, inkl. der neuen Flag-Pfade), eigener CI-Job.
- Migration beide Tools:
accounts/oidc.py+config/oidc_discovery.pylöschen;AUTHENTICATION_BACKENDS/OIDC_OP_LOGOUT_URL_METHODaufbasicbar_auth.oidc.*; Importe in urls/views/serializers umstellen;INSTALLED_APPS+basicbar_auth. User-Model bleibt unangetastet. - Migration abstimmbar zusätzlich:
OIDC_MATCH_BY_USERNAME_FALLBACK=Truesetzen (bisheriges Verhalten, an der UOS unkritisch — Kennungen werden nicht neu vergeben).
- Neu:
TranslatableField+TranslationFormProvider/useTranslationForm— die vereinheitlichte Übersetzungs-Editor-Komponente beider Tools. Vertrag: per Sprache (values+onChange(lang, text)), n Sprachen ausSUPPORTED_LANGUAGES(UI-Sprache-zuerst),renderInputfür Custom-Editoren,singleLanguage(Easy Mode) als Prop,format="html"(Statuspunkte ignorieren Markup, Übersetzung erhält es),MAX_TRANSLATE_LENGTH-Kappe. Der HTTP-Aufruf wird vom Tool injiziert:<TranslationFormProvider translate={…}>. - Neue Peer-Dependency:
lucide-react. - Migration beide Tools: lokale
TranslatableField/TranslationFormersetzen;tailwind.configcontentum./node_modules/@basicbar/ui/dist/**/*.jserweitern (Komponenten-Klassen müssen gescannt werden); Provider bekommt dietranslate-Funktion. - Migration ausleihbar:
api.translateumformat-Parameter erweitern; Aufrufstellen bleiben unverändert (gleicher Feld-Vertrag). - Migration abstimmbar: lokaler Wrapper behält
value/onChange(next),variant="rich"(RichTextEditor) und Easy Mode; Tab-Reihenfolge folgt jetzt der UI-Sprache statt fix kanonisch-zuerst.
- Erstes UI-Paket (Phase 3), Modell „ein Designsystem, pro Tool ein eigener
Akzent“:
createPreset({ colors })(Font, Dark Mode per.dark-Klasse, Motion-Tokens; dieslate/brand-Ramps bleiben als Identität im Tool),base.css(A11y-Basis: focus-visible-Ring, Skip-Link, reduced-motion, color-scheme, accent-color),ThemeProvider/useTheme/prePaintScript(Auto/Light/Dark,storageKeykonfigurierbar),initI18n({ resources })undcontentLang. - Distribution: npm-Tarball via GitLab Generic Package Registry,
CI-Publish beim Tag
ui/vX.Y.Z. - Migration ausleihbar: tailwind.config auf Preset, index.css auf
@import "@basicbar/ui/base.css", theme.tsx/i18n.ts/contentLang.ts löschen und Importe auf@basicbar/uiumstellen. - Migration abstimmbar: dito; zusätzlich ThemeProvider statt des lokalen
Theme-Moduls (mit
storageKey="abstimmbar_theme"für Bestandsnutzer).
- Erstes Paket (Phase 2):
ai(LiteLLM-Client) undtranslation_service(LibreTranslate-Client) aus den konsolidierten Tool-Fassungen übernommen; Settings-Zugriff jetzt mit Paket-Defaults (conf.py) — unkonfiguriert ist alles aus, ein Tool ohne Settings-Block startet unverändert. - Kanonischer Translate-Endpunkt:
POST {text, source, target, format?}→{translated}; Sprachvalidierung, HTML-Sanitizing (html_sanitize.pyaus abstimmbar, jetzt mit nh3-Abhängigkeit), englische Fehlertexte. - Neu: Capabilities-Endpoint (
GET→{"translation": bool, "ai": bool}, erweiterbar perextra_capabilities()). - Migration ausleihbar: Response-Key
translation→translated, URL/api/manage/translate/→ Paket-URL,TranslateView-Subclass für dieIsLenderOrAdmin-Permission, Format-Validierung neu. - Migration abstimmbar: Fehlertexte nun englisch; Imports
common.ai/common.translation_service/common.html_sanitize→basicbar_integrations.*.
- Phase 1: Repo-Gerüst, ADRs 0001–0003, CI (SPDX-Check), Extraktionsplan.
- CI: Testjob für basicbar-integrations (python:3.12-slim).