Files
kbcrm/AGENTS.md
T
gg b510c50497 Server+Client: REST-API für Kontaktadresse und CallLog, In-Memory vollständig entfernt, CLI-Musterdaten, Route-Param-Fix
- Server: ORM-Modelle Kontaktadresse (kontaktadressen) und CallLog (call_logs) mit FK projekt_id
- Server: Geschäftslogik kontaktadresse.py und call_log.py (get/create/update/delete)
- Server: DB-Migration V01_03 (kontaktadressen + call_logs Tabellen)
- Server: REST-Endpunkte /xhr/kontaktadresse/* und /xhr/calllog/* mit Autorisierung
- Server: CLI init-db legt Muster-Kontaktadressen (1-3/Projekt) und Muster-Gesprächsnotizen (2-5/Projekt) an
- Client: kontaktadresse.ts auf REST umgestellt, snake_case, In-Memory entfernt
- Client: call_log.ts auf REST umgestellt, snake_case, In-Memory entfernt, Submit-Handler implementiert
- Client: projekt.ts In-Memory vollständig entfernt (keine weiteren Verbraucher)
- Client: Route-Params projektId → projekt_id korrigiert (3 Stellen in projekt.ts)
- Client: addCallLog in projekt.ts Route-Params auf snake_case angepasst
- AGENTS.md: Erinnerung client-build-Skill nach .ts-Änderungen hinzugefügt

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-09-04 12:35:07 +02:00

4.3 KiB
Raw Blame History

Architektur der Anwendung

Beachte die strukturellen Vorgaben, die in ai-context/AI-operative-Vorgaben.md definiert sind. In den Programmen sollen aussagekräftige Kommentare in deutsch erstellt werden.

Vorgaben git Versionsverwaltung

Ein neuer Branch darf nur auf ausdrückliche Anweisung hin erstellt werden. Ohne diese Anweisung werden Änderungen immer in main gemacht.

Vorgaben für die Typescript und mithriljs Entwicklung

Verwende bei der GUI primar die widgets, die es in client/Components/widgets gibt. Fehler widgets, gib eines Hinweis und erstelle einen Vorschlag für ein entsprechendes neues Widget. Es soll immer ein responsive Design implmentiert werden, da die App sowohl auf PCs als auch auf mobilen Geräten laufen soll. Verwende für Attribute der GUI-Oberfläche nach Möglichkeit Klassen aus NGINX_Server/html/static/w3.css, insbesondere wenn es darum geht, eine Respnosive Design zu implentieren. Für Farben (foreground und background) verwende priorisiert die Klassen aus NGINX_Server/html/static/app-theme.css View-Container werden mit w3-container.w3-auto gewrappt, damit sie auf kleinen Bildschirmen 100% und auf großen bis max. 1140px (bzw. 95%) zentriert nutzen.

Bei Mithril m(...)-Aufrufen mit längeren Attributlisten (z.B. mehrere style-Eigenschaften oder mehrere Attribute) schreibe die Attribute untereinander, sobald sie in einer Zeile nicht mehr gut lesbar sind (Faustregel: mehr als 2–3 Attribute oder ein mehrzeiliges style-Objekt). Kurze Attributlisten (1–2 Attribute, einzeiliges style) dürfen in einer Zeile bleiben. Formatbeispiel:

m("div.w3-bar-block.w3-border", {
    style: {
        width: '95%',
        'max-height': '220px',
        'overflow-y': 'auto',
        position: 'absolute',
        'z-index': '1000'
    }
})

Für Symbole auf Buttons und ähnlichen Steuerelementen verwende Symbole aus den Google Material Icons. Erstelle die Datenmodelle für die Typescript-Entwicklung im Verzeichnis Client/Models. Erstelle für die verschiedenen Datenmodelle (Kunde, Projekt usw.) eigene .ts-Dateien. Erstelle in der jeweiligen Datei auch den Aufruf der REST-Api für die Server-Seite.

Beim Aufruf einer Bearbeitungsmaske werden in den Route-Params nur die ID (und ggf. zum Vorbelegen notwendige Eltern-FKs wie kunden_id) übergeben — nicht die vollständigen Felder des Objekts. Die Maske lädt die Daten frisch vom Server via fetchXxxById(id) im oninit. So wird sichergestellt, dass die Daten aktuell sind und zwischenzeitliche Änderungen anderer Nutzer nicht mit veralteten Werten aus der Liste überschrieben werden. Beim Neuanlegen (id === -1) entfällt der Fetch; vorbelegte Werte (z.B. kunden_id) kommen aus den Route-Params.

Bei m.ClosureComponent den Closure-Parameter weglassen (() =>) und Attribute ausschließlich über das vnode des jeweiligen Lifecycle-Hooks (view, oninit, onupdate etc.) lesen. Das vnode der Closure-Funktion ist ein Snapshot zum Erzeugungszeitpunkt und wird bei Redraws nicht aktualisiert — daraus gelesene attrs sind veraltet. Initialisierung, die attrs braucht, gehört nach oninit. Beispiel:

export const Select: m.ClosureComponent<iSelect> = () => {
    // closure-State ohne Referenz auf attrs
    let search = ""
    return {
        oninit: (vnode) => {
            // vnode.attrs hier initial lesen
            search = vnode.attrs.value
        },
        view: (vnode) => {
            // vnode.attrs enthält die aktuellen Werte je Render-Durchlauf
            const options = vnode.attrs.options
            ...
        }
    }
}

Nach jeder Änderung an .ts-Dateien unter Client/ ist der Build-Prozess (tsc + rollup) auszuführen, damit die deploybaren Bundles in NGINX_Server/html/static/ aktuell sind. Verwende dafür den client-build-Skill.

Vorgaben für die Server-seitige Entwicklung unter Python

Generierte Dateien nicht beachten

Das Verzeichnis Client/tsout/ enthält die JavaScript-Ausgabe der TypeScript-Kompilation und wird durch den Build-Prozess (tsc + rollup) erzeugt. Diese Dateien sind nicht manuell zu bearbeiten und brauchen bei der Codeanalyse nicht berücksichtigt zu werden. Ebenso sind die JavaScript-Dateien in NGINX_Server/html/static/ (z.B. kbp_crm_00.00.01.js) die Ausgabe des Rollup-Builds und nicht zu untersuchen.