# 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 `<section id="..." class="tab-content">`
- **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.

