# Dossier — Projekt-Anweisungen für Claude ## Was das ist **Dossier** ist ein Rhino 8 Plugin (Mac) mit React-WebView-Panels für architektonische Workflows (Wände, Decken, Öffnungen, Räume, SIA-416, Plan-Layouts). Teil der OpenStudio-Suite. Schwester-App: Rapport. **Dossier-Launcher** ist eine separate Tauri-App (`launcher/`), die Projekte verwaltet, Settings hält (auch für den Plugin), Auto-Updates liefert und im System-Tray lebt. ## Runtime: Python 3.9 CPython (verifiziert 2026-05-17) Dieser Ordner `DOSSIER/` läuft mit Rhinos **neuem Python-3-Engine** (CPython 3.9.10 via Script Editor). Der Vorgänger `rhino-panel/` bleibt **frozen** als IPy-2.7-Referenz. **Wie geladen wird (WICHTIG):** - ✅ **`_ScriptEditor`** → Datei öffnen + Run-Button → CPython 3.9 (Shebang `#! python3` wird respektiert). Das ist der **funktionierende Pfad**. - ✅ **Rhino Options → General → Command Lists → „Run these commands every time a model is opened"** → Form: `_-RunPythonScript "/voller/pfad.py"` (mit Dash + Quotes). Persistiert in `Options/General/StartupCommands` der `settings-Scheme__Default.xml`. Lädt das Skript bei jedem Rhino-Start silent, ohne File-Dialog. Trotz Dash bleibt Shebang `#! python 3` wirksam → CPython 3.9 (verifiziert 2026-05-17 Mac Rhino 8). Der Launcher trägt diesen Eintrag automatisch ein. - ⚠️ `_-RunPythonScript "path.py"` mit Dash in der **interaktiven Command- Line** → IronPython 2.7 (Legacy). NICHT benutzen für DOSSIER, sonst crasht die SectionStyle-Logik etc. - ⚠️ `_RunPythonScript path.py` ohne Dash — in der Command-Line OK (Py3 via Shebang, ohne Quotes, in einer Zeile). Im StartupCommands-Feld öffnet diese Form aber einen File-Dialog statt zu laufen. **Migration-Stand:** - ✅ Repo kopiert nach `DOSSIER/`, alle Pfade umgestellt - ✅ Shebangs aller Files auf `#! python3` (ohne Space) — Format das Rhino erkennt - ✅ Code war bereits Py3-syntax-kompatibel (kein xrange/iteritems/unicode()) - ✅ Plugin läuft als CPython 3.9.10, alle 9 Panels registrieren - ✅ Reflection.Emit + Eto.Forms + Bridge funktionieren - ✅ **`Rhino.DocObjects.SectionStyle()` instanziierbar** + `layer.SetCustomSectionStyle()` verfügbar — die volle Section-Style-API ist jetzt zugänglich (Anlass der Migration) ## Bei Code-Arbeit — Reihenfolge 1. **`ARCHITECTURE.md` zuerst lesen** — Module-Map, Konventionen, Schwachstellen. 2. **Dann das relevante Modul lesen**. Nicht raten was drin steht. 3. **Erst danach editieren**. ## Anti-Over-Engineering Diese Regeln sind nicht verhandelbar — Verstöße kosten Zeit beim Aufräumen. - **Keine Abstraktionen einführen, die ein konkretes Problem lösen.** Drei ähnliche Zeilen sind besser als eine Hilfsfunktion mit drei Aufrufstellen. - **Kein „aufräumen drumherum".** Ein Bugfix bleibt ein Bugfix. - **Kein Error-Handling für Szenarien, die nicht eintreten können.** - **Keine Feature-Flags, keine Migrations-Shims parallel zur alten Funktion.** - **Keine Kommentare die WAS sagen** — nur WARUM-Kommentare wenn nicht-offensichtlich. - **Keine erfundenen Module/Funktionen/Flags.** Erst `grep`, dann editieren. ## Anti-Patterns (aus echten Sessions) - **`try/except: pass` als Bug-Verstecker.** Lieber `print("[MODUL] err:", ex)` und weiter. - **Sticky-Reads ohne `is not None`-Check.** Siehe `ARCHITECTURE.md §4.4`. - **„Cleveres" Refactoring von Wand-Geometrie.** `elemente.py` (7244 LOC) enthält BIM-Logik die in Echtbau-Projekten läuft. NIE in einem Rutsch modularisieren ohne expliziten Auftrag + Test-Plan. - **Mac vs. Windows Rhino-Pfade verwechseln.** Mac Rhino 8 speichert Window-Layouts als **XML in `Scheme__Default/workspaces/.xml`**, nicht als `.rwl`. - **Python-Runtime annehmen statt prüfen.** Diagnose mit `print(sys.version)` — das hat uns 4 Wochen versteckte IPy2.7 gekostet. - **`document.title` mit Umlauten kaputt machen.** UI-Strings dürfen Umlaute; **Python-Backend bevorzugt `ue/oe/ae`** in Identifiern, Layer-Codes, UserString-Values. ## Python-Konventionen — POST-MIGRATION TARGET Sobald die Migration durch ist, gilt: - Datei-Header: `# ! python3` + `# -*- coding: utf-8 -*-` (werden dann wirksam) - **Aufruf in Rhino:** `_RunPythonScript "path"` (ohne Dash!) — sonst startet IPy 2.7. Alternative: `_-ScriptEditor` mit Code-Engine - `print(x)` — IMMER mit Klammern (Python-3-Style) - `builtins` statt `__builtin__` - f-strings erlaubt: `f"value: {x}"` - CLR: `import clr; clr.AddReference("System.Drawing"); from System.Drawing import Color` - UI-Strings dürfen Umlaute, Code-Identifier nicht (`tuer`, nicht `tür`) ## Build & Reset (Cheatsheet) ```bash # Rhino-Panels Frontend npm run build # im Repo-Root # Launcher Frontend cd launcher && npm run build # Launcher Backend Check cd launcher/src-tauri && cargo check # Launcher Release (signiert, schreibt latest.json) cd launcher && ./scripts/release.sh # Python-Syntax-Check (kein Rhino nötig) python3 -c "import ast; ast.parse(open('rhino/elemente.py').read())" # Runtime-Verify in Rhino (welcher Python-Engine läuft wirklich?) _RunPythonScript /Users/karim/STUDIO/DOSSIER/rhino/startup.py # Erste Zeile sollte zeigen: [STARTUP] Python: 3.x ... nach Migration ``` **Plugin reset in Rhino** (nach Python-Änderungen): ```python _RunPythonScript /Users/karim/STUDIO/DOSSIER/rhino/_reset_panels.py ``` ## Design-System - Petrol-Grün `--accent: #5fa896` (Hauptakzent), dunkles Petrol `#2f5d54` - Hintergrund `--bg: #0e1413` - Fonts: Krungthep/Archivo Black für „DOSSIER"-Logo, Playfair Display für Headings, DM Mono für Body - Konsistent zur Website (`/Users/karim/STUDIO/DOSSIER-WEBSITE/`) ## Settings-Files (Pfade) - **Launcher → Rhino IPC** (file-based, kein Socket): `~/Library/Application Support/ch.gabrielevarano.Dossier/dossier_settings.json` - Legacy-Fallback (read-only): `~/Library/Application Support/RhinoPanel/dossier_settings.json` - Launcher-Cache: `~/Library/Application Support/ch.gabrielevarano.Dossier/recent.json` ## Vorgänger-Codebase Der alte Ordner `/Users/karim/STUDIO/rhino-panel/` bleibt als **read-only Referenz** stehen. Wenn ein Feature dort funktioniert das hier noch nicht portiert ist — dort schauen, dann hier neu in Python-3-Style implementieren. **Nicht** einfach kopieren, sondern beim Übertragen den Migrations-Style anpassen. ## Wenn unklar — fragen, nicht raten Wenn die Aufgabe ambig ist oder Konsequenzen über die offensichtlichen hinausgehen: erst nachfragen.