# Vendoo — Projekt-Kontext Du arbeitest am Projekt "Vendoo" — ein lokaler Multi-Plattform Listing-Generator mit AI, Lagerverwaltung und Publishing-System. Lies zuerst `FEATURES.md` im Projektroot — das ist die vollstaendige Feature-Dokumentation mit Tech Stack, Projektstruktur, DB-Schema, allen 80+ API-Endpunkten und 17 Feature-Beschreibungen. ## Tech Stack - **Backend:** Node.js + Express (ESM, `"type": "module"`) - **Frontend:** Vanilla HTML/CSS/JS — kein Framework, kein Build-Step, kein TypeScript - **Datenbank:** SQLite via `better-sqlite3` (WAL-Modus) - **AI:** Anthropic Claude, OpenAI, OpenRouter, Ollama (lokal) - **Bilder:** `sharp` (Resize, BG-Remove, Watermark) - **Rich-Text:** Quill Editor - **E-Mail:** Nodemailer (SMTP) - **Extension:** Chrome Manifest v3 ## Dateistruktur (wo was hingehoert) | Aenderung | Datei(en) | |---|---| | Neue API-Route | `server.mjs` — Route hinzufuegen + Import erweitern | | Neue DB-Funktion | `lib/db.mjs` — Funktion exportieren | | Neue DB-Spalte | `lib/db.mjs` — MIGRATIONS-Array erweitern (try/catch ALTER TABLE Pattern) | | Neues UI-Tab | `public/index.html` (Sidebar-Button + Section), `public/app.js` (TAB_TITLES + switchToTab + Logik), `public/style.css` | | Neuer AI-Provider | `lib/ai-*.mjs` + `lib/ai-router.mjs` erweitern | | Neue Plattform | `platforms/*.mjs` + `lib/categories.mjs` + `lib/fees.mjs` + `lib/html-templates.mjs` | | Styling | `public/style.css` — CSS Custom Properties fuer Theming | ## Konventionen - **Sprache:** UI ist komplett Deutsch - **SKU-Format:** `VD-XXXX` (auto-generiert, 4-stellig aufsteigend) - **Navigation:** Sidebar mit `data-tab` Attributen, Tab-Inhalte als `
` - **Topbar-Titel:** `TAB_TITLES` Map in `app.js` muss fuer neue Tabs erweitert werden - **Dark Mode:** CSS-Variablen unter `[data-theme="dark"]`, niemals hardcoded Farben - **Auth:** Session-basiert, Rollen `admin`/`editor`, CSRF-Token bei state-changing Requests - **DB-Migrationen:** Neue Spalten als Eintrag in `MIGRATIONS`-Array (Zeile ~17-21 in db.mjs): ```js const MIGRATIONS = [ ['spaltenname', 'TEXT'], // oder 'REAL', "TEXT DEFAULT 'wert'" ]; // Wird automatisch per try/catch ALTER TABLE ausgefuehrt ``` - **API-Pattern:** REST, JSON-Body, Fehler als `{ error: 'message' }` - **Frontend-API-Aufrufe:** `api(method, path, body)` Helper in app.js (fuegt Auth + CSRF automatisch hinzu) - **Toast-Benachrichtigungen:** `toast('Nachricht')` in app.js - **Quill-Editor:** `initQuill(selector, placeholder)` — gibt Editor-Instanz zurueck ## Server starten ```bash npm install # Dependencies installieren npm run dev # Dev-Server mit --watch (Port 8124) npm start # Produktiv-Server ``` Oder: `setup.bat` fuer gefuehrte Installation. ## Wichtige Dateien nach Groesse | Datei | Zeilen | Inhalt | |---|---|---| | `public/app.js` | ~3240 | Gesamte Frontend-Logik | | `server.mjs` | ~1250 | Alle API-Routen + Middleware | | `public/style.css` | ~1200 | Komplettes Styling + Dark Mode + Responsive | | `public/index.html` | ~845 | HTML-Struktur (Sidebar, Tabs, Modals, Forms) | | `lib/db.mjs` | ~390 | Datenbank-Zugriff (alle CRUD-Funktionen) | | `lib/categories.mjs` | ~360 | Kategorie-Baeume pro Plattform | | `lib/auth.mjs` | ~290 | Auth-System (Users, Sessions, Audit) | | `lib/ebay-api.mjs` | ~270 | eBay REST API + OAuth2 | | `lib/mailer.mjs` | ~210 | SMTP E-Mail-Versand | | `lib/etsy-api.mjs` | ~185 | Etsy REST API v3 + OAuth2 PKCE | | `extension/content.js` | ~1170 | Chrome Extension Content Script | ## Aktueller UI-Stand - Version `1.3.0` - UI 2026 Slice 05: Publish-Center - Smart Copy, direkte Veröffentlichung, eBay Queue und Scheduling arbeiten in einer gemeinsamen Oberfläche. - Interne Publish-Arbeitsschritte dürfen keine separaten Browserfenster oder redundanten Modale öffnen. ## Bildarchitektur ab 1.23.0 - FLUX/ComfyUI ist der einzige lokale generative Bilddienst. - Das FLUX Studio arbeitet textbasiert und getrennt von Produktbild-Werkzeugen. - Keine VTO-, Python-, Torch- oder ONNX-Laufzeit wieder einführen, solange kein neuer ausdrücklicher Architekturentscheid dokumentiert ist. - FLUX-Studio-Aufträge und Varianten sind in `flux_prompt_jobs` und `flux_prompt_job_variants` persistent. - Fortschritt im FLUX Studio wird als reale Phase dargestellt; keine aus Laufzeit geschätzten Prozentwerte ergänzen. - ComfyUI-Prompt-IDs müssen für Abbruch, Historie und Neustart-Wiederaufnahme erhalten bleiben. - Der Advanced Image Editor arbeitet nicht destruktiv: Originaldateien niemals überschreiben oder löschen. - Jede gespeicherte Bearbeitung muss eine neue Datei und einen Eintrag in `image_edit_versions` erzeugen. - Bildpfade müssen strikt auf `uploads/` begrenzt und gegen Traversal geschützt bleiben. - Hintergrundentfernung, Inpainting, Outpainting und Maskeneditor nicht als Platzhalter ergänzen; diese Funktionen benötigen eigene spätere Slices.