diff --git a/AGENTS.md b/AGENTS.md index 9fad436..4773d92 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -117,6 +117,28 @@ Dokumentation und Verifikation unten für die Größeneinschätzung). vorhanden, und fällt sonst auf die klassischen `versapad_config{1,2,3}.json` zurück — beide Ansichten müssen dieselbe Quelle zeigen, sonst wirkt eine Bearbeitung "verschwunden". +- **Config-Pfad darf NIE im Installationsverzeichnis liegen (2026-08-15, + Datenverlust-Bug):** `build_and_deploy.ps1` räumt sein Zielverzeichnis vor + jedem Deploy komplett ab (`Remove-Item $localDir -Recurse -Force`). Nachdem + `app_dir()` am selben Tag auf genau dieses Verzeichnis gezeigt hatte, hat + **jeder Rebuild die Nutzer-Config mitgelöscht**; die App hat sie danach + kommentarlos leer vom Board neu aufgebaut (`load_or_fetch()` → + `fetch_from_board()`), wodurch alle Notizen weg waren. Besonders tückisch: + Board-Bindings und LEDs sahen danach völlig normal aus, nur die rein + lokalen Felder (Notizen, Profilnamen) fehlten -- der Schaden ist also + unsichtbar, wenn man nur aufs Grid schaut. Fix: `app_dir()` liefert jetzt + `%APPDATA%\VersaPadViewer` (Roaming), getrennt vom Installationsordner in + `%LOCALAPPDATA%`; zusätzlich rettet `build_and_deploy.ps1` vorgefundene + `versapad_config*.json` aus dem Zielverzeichnis über den Deploy hinweg + (für Altinstallationen). **Regel für künftige Änderungen: Programm- und + Datenverzeichnis nie zusammenlegen, egal wie praktisch "alles an einem + Ort" klingt.** +- **Nur EIN Config-Pfad, unabhängig vom Startweg (2026-08-15):** `app_dir()` + hat bewusst KEINEN `sys.frozen`-Zweig mehr. Vorher sah die gebaute `.exe` + eine andere Datei als der aus dem Quellcode gestartete MCP-Server, was zu + zwei auseinanderlaufenden Configs führte (die `.exe` zeigte ein anderes + Profil 0 als der MCP-Server meldete). Wer hier wieder nach Startweg + unterscheidet, baut denselben Bug erneut ein. - **Installierbarkeit verbessert 2026-08-14:** Drei Probleme beim Weitergeben an andere Leute behoben. (1) `build_and_deploy.ps1` starb bei fehlenden Paketen (pyinstaller/pystray/pillow) kommentarlos, v.a. bei @@ -131,7 +153,10 @@ Dokumentation und Verifikation unten für die Größeneinschätzung). Funktion) liefert bei der gebauten `.exe` deren Installationsordner (`sys.executable`-Verzeichnis), sonst den Projektordner (`__file__`- Verzeichnis) -- `DEFAULT_PATH` hängt jetzt daran, landet also immer neben - der laufenden Installation. `versapad_data.CONFIG_PATHS` (Lese-Interop + der laufenden Installation. **Diese app_dir()-Variante ist seit + 2026-08-15 überholt und war aktiv schädlich, siehe unten "Config-Pfad + darf nie im Installationsverzeichnis liegen".** + `versapad_data.CONFIG_PATHS` (Lese-Interop mit der C#-VersaGUI) bleibt bewusst auf dem Desktop, siehe oben. (3) Fehlte die Config UND war kein Board erreichbar, blockierte das Tool mit einer Fehlermeldung statt zu starten. Fix: `load_or_fetch()` legt jetzt bei @@ -189,6 +214,24 @@ Dokumentation und Verifikation unten für die Größeneinschätzung). `vcomb.DEFAULT_PATH`, fällt nur bei fehlender/kaputter Datei auf `default_combined()` zurück. Bei jedem "komisches Layout"-Report hier immer ALLE 3 Profile prüfen, nicht nur das gemeldete. +- **Randloses Fenster (seit 2026-08-15):** Die Titelleiste ist per reinem Tk + `overrideredirect(True)` ausgeblendet -- **niemals** per ctypes/WinAPI + nachhelfen (kein `SetWindowLongW`/`ShowWindow` auf das eigene Fenster), + siehe Speicher-Notiz "keine Selbstversteck-Fenstertricks": genau diese + Kombination hat in einem anderen Projekt Bitdefender-Fehlalarme + ausgelöst. Konsequenzen, die mitgebaut werden müssen: kein + Taskleisten-Eintrag (Rückweg nur über das Tray-Icon), kein Ziehen am + Rahmen (Kopfzeile ist deshalb per `` verschiebbar), keine + System-Buttons (eigene `✕`/`—` in der Kopfzeile, beide legen ins Tray) + und **keine Resize-Ränder**. +- **Der Größen-Anfasser hängt per `place()` an der Fensterecke, nicht + gepackt am Ende des Inhalts.** Gepackt verschwindet er, sobald das Fenster + kleiner als der Inhalt ist -- also exakt dann, wenn man ihn zum + Vergrößern bräuchte. `MIN_W/MIN_H` begrenzen das Verkleinern. +- Fensterhöhe muss zum Karteninhalt passen: seit die Karten eine Notizzeile + haben (`CARD_H` 84 → 114) braucht das Fenster ~960px, sonst liegen + Encoder-Bereich und Fußzeile unterhalb des Rands. Wer `CARD_H` ändert, + muss `geometry()` mit anpassen. - HID-Tasten-Auswahl im Programmiermodus ist ein Dropdown, kein Tastendruck-Capture (bewusst — kein WinAPI-Hook, um keinen AV-Fehlalarm wie bei den Fensterverstecktricks in anderen Projekten zu riskieren). @@ -239,6 +282,28 @@ Byte-Identität), nicht nur gegen Beispieldaten. Vor jedem Schreibvorgang aufs Board: erst mit unveränderten Daten testen (Identity-Write), bevor echte Änderungen geschrieben werden. +**Änderungen an der Config immer aus der Sicht prüfen, die die laufende App +hat (2026-08-15 gelernt):** Claudes Bash- und PowerShell-Werkzeuge sehen +unter `C:\Users\chris\AppData\...` teilweise *unterschiedliche* Dateien — +derselbe Pfad lieferte gleichzeitig 29826 Bytes (Bash/MCP-Server) und +28455 Bytes (PowerShell/`.exe`). Konkret heißt das: **Config-Schreibvorgänge +über den versapad-MCP-Server (`save_local()`) erreichen die installierte +`.exe` nicht zuverlässig.** Das hat eine Fehlersuche über viele Runden +verschleppt, weil "Notizen sind in der Datei" (Bash) und "App zeigt keine +Notizen" gleichzeitig stimmten. Vorgehen: +- Config-Dateien, die die installierte App lesen soll, über **PowerShell** + schreiben/prüfen (`Get-Item`, dort ausgeführtes `python`), nicht über Bash. +- Bei "Änderung wirkt nicht"-Symptomen als Erstes Dateigröße/mtime aus + *beiden* Sichten vergleichen, bevor Code-Ursachen gesucht werden. +- `Z:\Git\...` (SMB-Share) ist von diesem Effekt nicht betroffen — Quellcode + und Build verhalten sich normal. + +Verlässlich zum Ziel führt bei solchen Widersprüchen ein temporäres +Diagnose-Modul, das im gebauten Bundle mitläuft und `app_dir()`, +`DEFAULT_PATH`, `os.stat()` und den tatsächlich geladenen JSON-Inhalt in eine +Datei schreibt — damit war die Ursache in einem Durchlauf sichtbar, nachdem +Vermutungen mehrfach danebenlagen. + ## Naming Code-Identifier englisch (Python-Konvention: `pack_config`, `read_macros`, diff --git a/README.md b/README.md index cd9d373..4ca6982 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ echtes Board getestet (Read-Modify-Write ist byte-identisch zum Original, inklusive CRC). Nicht vorhanden: automatisierte Tests (Verifikation läuft manuell gegen ein angeschlossenes Board), eine vorgefertigte `.exe` zum Download (siehe unten, warum), und Mehrbenutzer-/Netzwerkbetrieb. Die eigene -Config-Datei (`versapad_config_all.json`) liegt automatisch neben der -Installation (siehe „Aufbau" unten) und wird bei Bedarf automatisch neu -angelegt — kein manuelles Pfad-Anpassen mehr nötig. Nur die *optionale* +Config-Datei (`versapad_config_all.json`) liegt automatisch unter +`%APPDATA%\VersaPadViewer\` (siehe „Aufbau" unten) und wird bei Bedarf +automatisch neu angelegt — kein manuelles Pfad-Anpassen mehr nötig. Nur die *optionale* Lese-Interop mit den JSON-Exports der offiziellen VersaGUI (`versapad_data.CONFIG_PATHS`) ist noch für eine bestimmte Windows-Maschine hartkodiert (OneDrive-Desktop) — für einen anderen Rechner dort anpassen, @@ -41,6 +41,11 @@ falls gewünscht. Tool-Aufruf ändern, ohne Klicks in der GUI (siehe unten) - **Tray-Icon** — minimiert/schließt ins Tray statt in die Taskleiste, wie die offizielle VersaGUI +- **Randloses Fenster** — ohne Windows-Titelleiste, dafür kompakter Kopf + (Modus-Checkboxen direkt neben dem Titel). Verschieben durch Ziehen an + der Kopfzeile, Größe ändern am Anfasser unten rechts, `✕`/`—` legen ins + Tray. Einen Taskleisten-Eintrag gibt es dadurch nicht — das Fenster kommt + über das Tray-Icon zurück. ## Voraussetzungen @@ -111,14 +116,20 @@ VersaMCU-Firmware-Quellen übernommen und gegen ein echtes Board validiert (Read → unpack → pack ist bytegenau identisch zum Original, inklusive CRC). Die eigene Config-Datei (`versapad_config_all.json` — alle 3 Profile + -Makros + lokale Profilnamen, siehe `versapad_combined.py`) liegt neben der -Installation: bei der gebauten `.exe` im selben Ordner, beim Start aus dem -Quellcode im Projektordner (`versapad_data.app_dir()`). Fehlt sie (z.B. -frische Installation), wird sie automatisch angelegt — per Serial vom +Makros + lokale Profilnamen + Notizen, siehe `versapad_combined.py`) liegt +unter `%APPDATA%\VersaPadViewer\` (`versapad_data.app_dir()`), also +**getrennt vom Installationsordner** und unabhängig davon, ob die `.exe` +oder der Quellcode gestartet wurde. Beides ist Absicht: das Build-Skript +räumt sein Zielverzeichnis vor jedem Deploy komplett ab (läge die Config +dort, würde jeder Rebuild sie löschen), und ein vom Startweg abhängiger +Pfad hatte zu zwei auseinanderlaufenden Configs geführt. Fehlt die Datei +(z.B. frische Installation), wird sie automatisch angelegt — per Serial vom Board, falls eins angeschlossen ist, sonst als leere Default-Config. Profilnamen (`profile_names`) stehen direkt in dieser Datei und lassen sich per Doppelklick auf einen Tab (in jedem Modus — Nur-Lesen, Live-Sync oder -Programmiermodus) oder `rename_profile()` (MCP) ändern. +Programmiermodus) oder `rename_profile()` (MCP) ändern. Notizen ebenso — +im Bearbeiten-Dialog des Programmiermodus oder per +`set_button_note()`/`set_encoder_note()` (MCP). Die klassischen `versapad_config1/2/3.json` sind kein von diesem Tool geschriebenes Format, sondern optionale Lese-Interop mit einem JSON-Export