4.9 KiB
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-tabAttributen, Tab-Inhalte als<section id="..." class="tab-content"> - Topbar-Titel:
TAB_TITLESMap inapp.jsmuss 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):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
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_jobsundflux_prompt_job_variantspersistent. -
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_versionserzeugen. -
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.