Console log #50

Closed
opened 2026-09-12 15:04:00 +02:00 by admin · 1 comment

Ein eigenes Panel/area unter tab view und zwischen den beiden seiten panels.
ebenfalls in der größe vertikal veränderbar wie die beiden seiten panels
alles was in console landet soll da drin landen


Übernommen aus todo-notes/console-log.md beim Umzug auf das Issue-System (2026-09-12).

  • Angelegt: 2026-09-12 · 3ed8b68 — Describe every value kind in one table instead of spreading it over the code
  • Gemeldet von: admin
Ein eigenes Panel/area unter tab view und zwischen den beiden seiten panels. ebenfalls in der größe vertikal veränderbar wie die beiden seiten panels alles was in console landet soll da drin landen --- *Übernommen aus `todo-notes/console-log.md` beim Umzug auf das Issue-System (2026-09-12).* - **Angelegt:** 2026-09-12 · `3ed8b68` — Describe every value kind in one table instead of spreading it over the code - **Gemeldet von:** admin
admin added the todo-note label 2026-09-12 15:04:00 +02:00
Owner

Umgesetzt in c47fd5e.

Was gebaut wurde

  • Log-Schicht (src/editor/console/log.ts): Ringpuffer über 500 Zeilen, push(level, text) plus Event. console.log/info/debug/warn/error werden global abgefangen und weiterhin ans Original durchgereicht, Installation vor app.init() in main.ts, damit auch Pixis Warnungen aus der Renderer-Erzeugung ankommen. Mehrere Argumente werden mit Leerzeichen verbunden, Objekte kurz als JSON, Error als erste Stack-Zeile.
  • Panel (src/editor/console/ConsolePanel.ts): drittes Kind des Mittelbereichs unter dem sichtbaren Tab, immer da, Höhe per Splitter('y') bis auf 0 verstellbar (nicht persistiert, wie die Seitenpanel-Breiten auch nicht). Kopfzeile CONSOLE mit Clear-Button rechts; sonst wird nie automatisch geleert. Autoscroll nur, wenn man unten steht.
  • Zeitstempel je Zeile, HH:MM:SS, gedimmt in einer eigenen Spalte — als zweites Label statt als Textpräfix, sonst fände locate('<meldung>') die Zeile nicht mehr. Eine mehrzeilige Meldung (Stack) bekommt eine Zeit für alle Teilzeilen.
  • Stumme Stellen angeschlossen: Behavior-Laufzeitfehler rot, setNotice-Hinweise als normale Zeile — beide direkt an die Log-Schicht, nicht durch console. Sonst hätte jeder Play-Pausenwechsel und jeder Unit-Testlauf Zeilen erzeugt (18 setNotice-Aufrufstellen, 7 Editor-Testdateien).

world.log bleibt unverändert

Gemessen und bewusst so: src/runtime/ importiert nichts aus src/editor/, behaviorError(world) ist eine Abfrage an einen Lauf (ein globaler Ringpuffer fände nach dem zweiten Play noch den Fehler des ersten), die Unit-Tests laufen ohne Browser in Node, und die e2e-Checks lesen world.log als exakte String-Liste über den Hook. Der Log-Node schreibt ohnehin schon in beides — seine Zeile steht durch das Capture von selbst im Panel.

Nebenwirkung: sechs e2e-Checks hingen an der Canvas-Höhe

Die flachere Mitte (Panel-Starthöhe 300 px) drückt den Graph-Fit auf Zoom 0,60. Repariert wurden die Annahmen, nicht die Zahlen:

Annahme Jetzt
„250 px unter der Mitte ist leer" __gm.emptySpot() / __gm.graph.emptySpot() — gesucht statt geraten
„60 Pixel Drag = 60 Graph-Einheiten" durch __gm.graph.zoom() geteilt
„ein Marquee über die Canvas erfasst alles" vorher wieder Fit
„Node 2500 Einheiten wegparken" Abstand aus canvasRect().w; fix 2500 stößt an MIN_ZOOM = 0.25

Ein Fund am Messgerät: locate/locateAll addierten die unskalierte Pixi-Textbreite zur globalen Position. Im skalierten Graph-Canvas lag der Klickpunkt dadurch zu weit rechts (gemessen 32,77 statt 26,1 px) — fällt nur nicht auf, solange der Fit-Zoom 1 ist. Jetzt über getBounds().

Belegt

./check.sh === CHECK EXIT 0 ===, 831 Tests
voller e2e ALL PASSED – 671 Checks (vorher 657), neuer Schritt 27
Jump-Run / Tetris / Actor 24 / 19 / 20
Gültigkeit Neubau nach dem Lauf ergibt das byte-identische Bundle (cmp)

Gegenproben, jede an ihrer eigenen Stelle: Zeitstempel pro Zeile statt pro Aufruf, Stunden ungepolstert, Zeit im normalen statt gedimmten Stil, dazu die vier aus der Panel-Runde (Capture, Ringpuffer, Clear, Fehler-Level).

Umgesetzt in **c47fd5e**. ### Was gebaut wurde - **Log-Schicht** (`src/editor/console/log.ts`): Ringpuffer über 500 Zeilen, `push(level, text)` plus Event. `console.log/info/debug/warn/error` werden global abgefangen und **weiterhin ans Original durchgereicht**, Installation vor `app.init()` in `main.ts`, damit auch Pixis Warnungen aus der Renderer-Erzeugung ankommen. Mehrere Argumente werden mit Leerzeichen verbunden, Objekte kurz als JSON, `Error` als erste Stack-Zeile. - **Panel** (`src/editor/console/ConsolePanel.ts`): drittes Kind des Mittelbereichs unter dem sichtbaren Tab, immer da, Höhe per `Splitter('y')` bis auf 0 verstellbar (nicht persistiert, wie die Seitenpanel-Breiten auch nicht). Kopfzeile `CONSOLE` mit Clear-Button rechts; sonst wird nie automatisch geleert. Autoscroll nur, wenn man unten steht. - **Zeitstempel** je Zeile, `HH:MM:SS`, gedimmt in einer **eigenen Spalte** — als zweites Label statt als Textpräfix, sonst fände `locate('<meldung>')` die Zeile nicht mehr. Eine mehrzeilige Meldung (Stack) bekommt eine Zeit für alle Teilzeilen. - **Stumme Stellen angeschlossen:** Behavior-Laufzeitfehler rot, `setNotice`-Hinweise als normale Zeile — beide **direkt** an die Log-Schicht, nicht durch `console`. Sonst hätte jeder Play-Pausenwechsel und jeder Unit-Testlauf Zeilen erzeugt (18 `setNotice`-Aufrufstellen, 7 Editor-Testdateien). ### `world.log` bleibt unverändert Gemessen und bewusst so: `src/runtime/` importiert nichts aus `src/editor/`, `behaviorError(world)` ist eine Abfrage an **einen** Lauf (ein globaler Ringpuffer fände nach dem zweiten Play noch den Fehler des ersten), die Unit-Tests laufen ohne Browser in Node, und die e2e-Checks lesen `world.log` als exakte String-Liste über den Hook. Der `Log`-Node schreibt ohnehin schon in beides — seine Zeile steht durch das Capture von selbst im Panel. ### Nebenwirkung: sechs e2e-Checks hingen an der Canvas-Höhe Die flachere Mitte (Panel-Starthöhe 300 px) drückt den Graph-Fit auf Zoom 0,60. Repariert wurden die **Annahmen**, nicht die Zahlen: | Annahme | Jetzt | |---|---| | „250 px unter der Mitte ist leer" | `__gm.emptySpot()` / `__gm.graph.emptySpot()` — gesucht statt geraten | | „60 Pixel Drag = 60 Graph-Einheiten" | durch `__gm.graph.zoom()` geteilt | | „ein Marquee über die Canvas erfasst alles" | vorher wieder `Fit` | | „Node 2500 Einheiten wegparken" | Abstand aus `canvasRect().w`; fix 2500 stößt an `MIN_ZOOM = 0.25` | **Ein Fund am Messgerät:** `locate`/`locateAll` addierten die *unskalierte* Pixi-Textbreite zur globalen Position. Im skalierten Graph-Canvas lag der Klickpunkt dadurch zu weit rechts (gemessen 32,77 statt 26,1 px) — fällt nur nicht auf, solange der Fit-Zoom 1 ist. Jetzt über `getBounds()`. ### Belegt | | | |---|---| | `./check.sh` | `=== CHECK EXIT 0 ===`, **831 Tests** | | voller e2e | **ALL PASSED – 671 Checks** (vorher 657), neuer Schritt 27 | | Jump-Run / Tetris / Actor | **24 / 19 / 20** | | Gültigkeit | Neubau nach dem Lauf ergibt das byte-identische Bundle (`cmp`) | Gegenproben, jede an ihrer eigenen Stelle: Zeitstempel pro Zeile statt pro Aufruf, Stunden ungepolstert, Zeit im normalen statt gedimmten Stil, dazu die vier aus der Panel-Runde (Capture, Ringpuffer, Clear, Fehler-Level).
admin added this to the Development project 2026-09-13 13:43:19 +02:00
admin moved this to Done in Development on 2026-09-13 13:44:11 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#50