Struktur: Docker/ (skrift-backend, signature-service), Webseite/ (skrift-configurator, skrift-job-manager), Produktion/ (skrift-produktion, AutoRecover). Aufgeräumt: signature-to-svg entfernt, Backend-PayPal-Service entfernt (PayPal läuft client-seitig im Configurator), Dev-/Test-Artefakte und Deployment-Dokus bereinigt, .dockerignore repariert. CLAUDE.md mit Architektur ergänzt. Secrets (.env, config.json) via .gitignore ausgeschlossen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
8.0 KiB
CLAUDE.md
Behavioral guidelines to reduce common LLM coding mistakes. Merge with project-specific instructions as needed.
Tradeoff: These guidelines bias toward caution over speed. For trivial tasks, use judgment.
1. Think Before Coding
Don't assume. Don't hide confusion. Surface tradeoffs.
Before implementing:
- State your assumptions explicitly. If uncertain, ask.
- If multiple interpretations exist, present them - don't pick silently.
- If a simpler approach exists, say so. Push back when warranted.
- If something is unclear, stop. Name what's confusing. Ask.
2. Simplicity First
Minimum code that solves the problem. Nothing speculative.
- No features beyond what was asked.
- No abstractions for single-use code.
- No "flexibility" or "configurability" that wasn't requested.
- No error handling for impossible scenarios.
- If you write 200 lines and it could be 50, rewrite it.
Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.
3. Surgical Changes
Touch only what you must. Clean up only your own mess.
When editing existing code:
- Don't "improve" adjacent code, comments, or formatting.
- Don't refactor things that aren't broken.
- Match existing style, even if you'd do it differently.
- If you notice unrelated dead code, mention it - don't delete it.
When your changes create orphans:
- Remove imports/variables/functions that YOUR changes made unused.
- Don't remove pre-existing dead code unless asked.
The test: Every changed line should trace directly to the user's request.
4. Goal-Driven Execution
Define success criteria. Loop until verified.
Transform tasks into verifiable goals:
- "Add validation" → "Write tests for invalid inputs, then make them pass"
- "Fix the bug" → "Write a test that reproduces it, then make it pass"
- "Refactor X" → "Ensure tests pass before and after"
For multi-step tasks, state a brief plan:
1. [Step] → verify: [check]
2. [Step] → verify: [check]
3. [Step] → verify: [check]
Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.
These guidelines are working if: fewer unnecessary changes in diffs, fewer rewrites due to overcomplication, and clarifying questions come before implementation rather than after mistakes.
Projekt: Skrift
Handschriftliche Dokumente als Service. Kunden konfigurieren Briefe/Postkarten/Umschläge im Web; ein Backend rendert sie als SVG in echter Handschrift; ein Schreibroboter (Pen-Plotter) schreibt sie physisch. Alle Software in diesem Ordner gehört zu Skrift. Sprache im Projekt: Deutsch.
Ebenen und Komponenten
Drei Ebenen, getrennt gehalten für einfachere Wartung:
Docker/ — serverseitig, hinter Nginx Proxy Manager (NPM)
- skrift-backend (Node/Express,
:4000, Domainbackend.skrift.de) — Main-Backend. Generiert Brief-/Umschlag-SVGs: Text → Scriptalizer-API (natürliche Handschrift-Variation) → eigene Font-Engine (src/lib/svg-font-engine.js). Preview-Cache + finaler Order-Output. Platzhalter-System ([[Name]]→ CSV). Kein PayPal im Backend — die PayPal-Zahlung läuft rein client-seitig im configurator über das PayPal-JS-SDK (actions.order.create/capturedirekt gegen PayPal). SVG-Fonts unterfonts/(tilda=PremiumUltra79,alva=PremiumUltra23,ellie=PremiumUltra39). Struktur:src/api/{routes,controllers,middleware},src/services(scriptalizer, placeholder),src/lib(svg-generator, svg-font-engine, page-layout). - signature-service (FastAPI,
:8000, Domainapi-sign.skrift.de) — zustandslos. Findet unsichtbare Marker-Token (§§SIG1§§) in einem gedruckten PDF, platziert die zugeordnete Unterschrift-SVG relativ dazu und liefert eine A4-SVG pro Seite (/render, ZIP) bzw. ein Vorschau-PDF (/preview). Keine Plotter-Kalibrierung/Offsets im Service — Mechanik wird in der Druckersoftware behandelt. Geometrie-Logik incore.py.
Webseite/ — WordPress-Plugins (öffentlich)
- skrift-configurator — öffentlicher Haupt-Konfigurator, Shortcode
[skrift_konfigurator]. Spricht das Backend nur über einen serverseitigen PHP-Proxy an (includes/api-proxy.php, REST-Namespaceskrift/v1/proxy/*), damit der API-Token nie ins Frontend gelangt. Liefert außerdem das Basis-CSS (--sk-*-Variablen,.sk-*-Klassen) sowie Admin-Settings (Backend-Verbindung, Preise, Produkte, Gutscheine). - skrift-job-manager — Kunden-Auftragsportal, Shortcode
[skrift_kundenauftrag]. Hängt hart am configurator (nutzt dessen CSS + Backend-Verbindungseinstellungen). Eigener Namespaceskrift/v1/job/*; ruft Backend u.a./api/order/register,/api/order/files. Signaturen: Kunde zeichnet auf einem<canvas>→ Striche werden client-seitig viapathsToSvg()als Polyline-SVG (M/L-Pfade) erzeugt und als Platzhalter[[signatur1..3]]mitgeschickt.
Produktion/ — lokale Windows-Software
- skrift-produktion — Main-Produktion. FastAPI auf
127.0.0.1:8765(öffnet Browser automatisch). Worker:FTPPollWorkerpollt SFTP nach neuen Aufträgen,MachinePollWorkerüberwacht die Plotter-Maschine,QueueWorkerarbeitet die Queue ab. Sendet SVGs an die Maschinen-API (Defaulthttp://192.168.2.32:90) mit Format-Templates (Maße/Position/Rotation) ausconfig.json. Signaturen-Tab ruftsignature-service /renderüber den eigenen EndpunktPOST /api/signature/printund schickt die A4-Signaturen an den Plotter (Service-URL inconfig.jsonunterapp.signature_backend_url, Defaulthttp://localhost:8000). - AutoRecover — kleines win32-Skript (
auto_recover.py). Erkennt das Java-„Error"-Fenster des Plotters (kein Papier) und klickt max. 3× „Recover".
Datenfluss (End-to-End)
- Kunde konfiguriert im configurator (oder job-manager) → WordPress-Proxy → skrift-backend generiert SVGs.
- skrift-backend schreibt den fertigen Order-Ordner nach
/var/skrift-output(docker-compose-Volume). Dieses Verzeichnis ist gleichzeitig das SFTP-Ziel, auf das per SFTP zugegriffen wird — kein Zwischenschritt. - skrift-produktion holt den Auftrag per SFTP und schickt die SVGs formatgerecht an den Plotter.
- Bei Unterschriften: gedrucktes PDF mit Marker-Token → signature-service platziert Signaturen → produktion sendet die A4-Signatur-SVGs an den Plotter.
- AutoRecover hält den Druck bei Papierende am Laufen.
Befehle
skrift-backend (Docker/skrift-backend)
npm install
npm start # node src/server.js → :4000
npm run dev # nodemon
docker-compose up -d # Prod (Volume: /var/skrift-output, fonts/ read-only)
signature-service (Docker/signature-service)
pip install -r requirements.txt
uvicorn app:app --host 0.0.0.0 --port 8000
pytest # ein Test: pytest tests/test_x.py::test_name
docker compose up -d --build
signature-to-svg (Docker/signature-to-svg) — uvicorn app.main:app --host 0.0.0.0 --port 8765 bzw. docker-compose up -d.
skrift-produktion (Produktion/skrift-produktion) — Einrichten.bat (venv + deps einmalig), dann Starten.bat (bzw. Starten (Debug).bat). Läuft auf 127.0.0.1:8765.
AutoRecover — python auto_recover.py; EXE-Build via build_exe.bat.
WordPress-Plugins haben keinen Build-Schritt (reines PHP/JS).
Wichtige Hinweise / Fallstricke
- NPM-Netz:
signature-servicehängt im externen Docker-Netznginx-proxy-manager_defaultund veröffentlicht keinen Host-Port — NPM proxyt intern percontainer_name. SCRIPTALIZER_ERR_FREQUENCY=0setzen: sonst erzeugt Scriptalizer absichtlich durchgestrichene „Fehler"-Wörter.- Secrets liegen im Repo:
Docker/skrift-backend/.enventhält reale Keys — nicht in Ausgaben/Commits streuen. - Der job-manager ist ohne den configurator nicht lauffähig (CSS + Backend-Settings kommen von dort).
FRONTEND_BACKEND_ZUSAMMENFASSUNG.mdstammt aus der Zeit vor dieser Ordnerstruktur (spricht von „WordPress Plugin" / „Docker Backend") und ist teils veraltet — diese CLAUDE.md hat Vorrang.