Document today's config-path, window-chrome and tooling gotchas
AGENTS.md gains the rules the day's debugging produced: never put the config in the install dir (the build script wipes it, silently costing all local-only fields), never branch app_dir() on sys.frozen (two diverging configs), the consequences that come with a frameless window, and why the resize grip must be placed rather than packed. Also records that Claude's Bash and PowerShell tools can see different files under AppData, which made "the notes are in the file" and "the app shows no notes" both true at once -- with the diagnostic-module approach that finally settled it. README: config now lives in %APPDATA%\VersaPadViewer, plus the frameless window and notes in the feature list.
This commit is contained in:
parent
91bac353b4
commit
9464cafaab
2 changed files with 85 additions and 9 deletions
67
AGENTS.md
67
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 `<B1-Motion>` 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`,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue