iris-gamebox 0.8.0: Gamebox-Seite als dritter Reiter im Seitenpanel — gemeinsame Spielauswahl, status, select (iris/Iris#169) #265

Closed
opened 2026-10-25 17:18:20 +00:00 by alf · 3 comments
Owner

Ziel

iris-gamebox 0.8.0: Die Gamebox-Seite wird dritter Reiter im rechten Seitenpanel (iris/Iris#169) —
dieselbe Spiele-Suche wie das „Gamebox"-Fenster, aber chat-gebunden: Hermes sieht dasselbe Spiel,
das der Nutzer gerade anschaut, und baut genau das. Nach dem Muster von comfyui-workflows 3.4.0 (#257).

Warum

Die Gamebox öffnet heute ein eigenes Fenster (usage_web_view_path). Wer im Chat „bau mir das"
sagt, muss das Spiel erst wieder heraussuchen — der Agent weiß nicht, was der Nutzer sieht. Der
dritte Reiter macht aus Fenster und Chat einen gemeinsamen Stand: Auswahl setzen, Build anstoßen,
Fortschritt sehen — beide Seiten, dieselben Befehle.

Befund (gemessen 2026-10-25)

  • Das Fundament ist gebaut und in zwei Plugins in Betrieb: Manifest-Schlüssel side_panel,
    Route side-panel-webview-url (münzt cfg_token, hängt chat_id an die URL), Pflichtbefehl
    status → {ok, chat_id, summary, detail}, summary (eine Zeile, Iris kappt 300) als
    [PLUGIN-PANEL: …]-Prefix beim Senden. Plan: iris/plans/SEITENPANEL-PLUGIN.md, PRs iris#170/#172.
  • web/search.html redet ausschließlich über cfg_token + POST /plugins/iris-gamebox/api/<cmd> —
    kein irisCall, kein postMessage. Der Reiter-Vertrag ist fast erfüllt, bevor es ihn gibt
    (dasselbe Bild wie bei comfyuis canvas-block.html).
  • Layout: .cols (340 px + Detail) stapelt schon bei max-width:820px; das Panel ist 320–900 pt
    breit → der Stapel-Branch greift meist, braucht Feinschliff wie comfyuis 560-pt-Branch
    (Trefferliste max-Höhe, Detail-Polster, Header-Umbruch).
  • Die Auswahl lebt nur im JS (state.sel in search.html) — ohne Server-Auswahl bleibt Hermes
    der Stand verborgen. comfyuis Antwort: selection.json neben der Registry + select/selection
    (Issue plugins#248), Seite schreibt, status liest, Skill erklärt es.
  • status fehlt in panel_api (21 Befehle, keiner davon). Achtung: fresh_index() lädt den
    ganzen Index — exodos.json ist 12 MB. status läuft im 5-Sekunden-Polling des Reiters und
    darf das nicht pro Aufruf parsen; die summary aus billigen Quellen bauen: Quellen
    (load_sources), Apps in der Ablage (apps-Logik), laufender Baufortschritt (Jobs-Verzeichnis),
    Auswahl-Datei — Zahl der Spiele nur aus dem bereits geladenen Pfad (browse lädt ohnehin), sonst
    weglassen.
  • iris_min_version ist 2.0.0; der Reiter existiert erst ab 2.0.1 (comfyui-workflows trägt 2.0.1).
    platforms: ["macos"] → der iOS-Ast betrifft dieses Plugin nicht.

Umsetzung

  • Manifest: side_panel: "web/search.html" (dieselbe Datei wie usage_web_view_path, kein
    zweites HTML — comfyui-Muster), iris_min_version → 2.0.1. status in panel_api.commands.
  • Gemeinsame Auswahl (der eigentliche Gewinn, analog #248): selection.json im
    Application-Support-Ordner des Plugins (Bedienzustand, nie im Index), Befehle select
    {handle} (leer hebt auf; antwortet wie status, damit der Reiter ohne zweite Runde umzeichnet)
    und Aufnahme der Auswahl in status.detail; CLI gamebox select --handle <h> / gamebox selection als Gegenstück für Hermes und Chat (Determinismus-Regel: Skript-Werkzeug, nicht
    Anleitung). Ungültige/unbekannte Handles ablehnen mit Meldung.
  • status nach Vertrag: antwortet immer mit dem gesendeten chat_id; summary eine Zeile,
    Auswahl vorn — etwa „Ausgewählt: Return to Zork · 4 Apps in der Ablage · Katalog bereit";
    detail: Auswahl + Apps der Ablage + ggf. laufender Build-Job (staat job), nie der Vollindex.
  • web/search.html: chat_id aus der URL lesen und bei jedem panel_api-Aufruf mitschicken;
    im Reiter-Modus (Kennung vorhanden) Auswahl nach select/selection setzen und beim Klick
    zurückschreiben — Fenster-Modus bleibt wie er ist; Reiter-CSS unter 560 px verfeinern;
    Build-Knopf behält build/job (Polling existiert bereits).
  • SKILL.md: Abschnitt „Plugin-Reiter im Seitenpanel" nach solidcraft-/comfyui-Muster
    ([PLUGIN-PANEL: Retro-Spiele als macOS-App] …-Marker, Stand über status mit chat_id,
    Bauen über build oder die CLI, Auswahl über select/selection); system_prompt.md nur falls nötig.
  • Anleitung + Store: Abschnitt in docs/erste-schritte.md; Version 0.8.0, changelog im
    Manifest, store/changelog.md-Abschnitt; Store-Seite aus store-page.json neu erzeugen
    (store_page.py --check). Veröffentlichung erst nach ausdrücklichem Wort.

Taktung

Ein Issue, ein PR, Version 0.8.0: Reiter ohne gemeinsame Auswahl wäre ein zweites Suchfenster im
Chat — Auswahl, status und Seite gehören zusammen. Der Reiter-Bau-Flow (Build aus dem Reiter)
nutzt nur vorhandene Befehle und ist kein eigener Schritt.

## Ziel iris-gamebox 0.8.0: Die Gamebox-Seite wird dritter Reiter im rechten Seitenpanel (iris/Iris#169) — dieselbe Spiele-Suche wie das „Gamebox"-Fenster, aber chat-gebunden: Hermes sieht dasselbe Spiel, das der Nutzer gerade anschaut, und baut genau das. Nach dem Muster von comfyui-workflows 3.4.0 (#257). ## Warum Die Gamebox öffnet heute ein eigenes Fenster (`usage_web_view_path`). Wer im Chat „bau mir das" sagt, muss das Spiel erst wieder heraussuchen — der Agent weiß nicht, was der Nutzer sieht. Der dritte Reiter macht aus Fenster und Chat einen gemeinsamen Stand: Auswahl setzen, Build anstoßen, Fortschritt sehen — beide Seiten, dieselben Befehle. ## Befund (gemessen 2026-10-25) - Das Fundament ist gebaut und in zwei Plugins in Betrieb: Manifest-Schlüssel `side_panel`, Route `side-panel-webview-url` (münzt `cfg_token`, hängt `chat_id` an die URL), Pflichtbefehl `status` → `{ok, chat_id, summary, detail}`, `summary` (eine Zeile, Iris kappt 300) als `[PLUGIN-PANEL: …]`-Prefix beim Senden. Plan: `iris/plans/SEITENPANEL-PLUGIN.md`, PRs iris#170/#172. - `web/search.html` redet ausschließlich über `cfg_token` + `POST /plugins/iris-gamebox/api/<cmd>` — kein `irisCall`, kein `postMessage`. Der Reiter-Vertrag ist fast erfüllt, bevor es ihn gibt (dasselbe Bild wie bei comfyuis `canvas-block.html`). - Layout: `.cols` (340 px + Detail) stapelt schon bei `max-width:820px`; das Panel ist 320–900 pt breit → der Stapel-Branch greift meist, braucht Feinschliff wie comfyuis 560-pt-Branch (Trefferliste max-Höhe, Detail-Polster, Header-Umbruch). - **Die Auswahl lebt nur im JS** (`state.sel` in search.html) — ohne Server-Auswahl bleibt Hermes der Stand verborgen. comfyuis Antwort: `selection.json` neben der Registry + `select`/`selection` (Issue plugins#248), Seite schreibt, `status` liest, Skill erklärt es. - **`status` fehlt in panel_api** (21 Befehle, keiner davon). Achtung: `fresh_index()` lädt den ganzen Index — `exodos.json` ist **12 MB**. `status` läuft im 5-Sekunden-Polling des Reiters und darf das nicht pro Aufruf parsen; die `summary` aus billigen Quellen bauen: Quellen (`load_sources`), Apps in der Ablage (`apps`-Logik), laufender Baufortschritt (Jobs-Verzeichnis), Auswahl-Datei — Zahl der Spiele nur aus dem bereits geladenen Pfad (`browse` lädt ohnehin), sonst weglassen. - `iris_min_version` ist 2.0.0; der Reiter existiert erst ab 2.0.1 (comfyui-workflows trägt 2.0.1). `platforms: ["macos"]` → der iOS-Ast betrifft dieses Plugin nicht. ## Umsetzung - **Manifest**: `side_panel: "web/search.html"` (dieselbe Datei wie `usage_web_view_path`, kein zweites HTML — comfyui-Muster), `iris_min_version` → 2.0.1. `status` in `panel_api.commands`. - **Gemeinsame Auswahl** (der eigentliche Gewinn, analog #248): `selection.json` im Application-Support-Ordner des Plugins (Bedienzustand, nie im Index), Befehle `select` `{handle}` (leer hebt auf; antwortet wie `status`, damit der Reiter ohne zweite Runde umzeichnet) und Aufnahme der Auswahl in `status.detail`; CLI `gamebox select --handle <h>` / `gamebox selection` als Gegenstück für Hermes und Chat (Determinismus-Regel: Skript-Werkzeug, nicht Anleitung). Ungültige/unbekannte Handles ablehnen mit Meldung. - **`status`** nach Vertrag: antwortet immer mit dem gesendeten `chat_id`; `summary` eine Zeile, Auswahl vorn — etwa „Ausgewählt: Return to Zork · 4 Apps in der Ablage · Katalog bereit"; `detail`: Auswahl + Apps der Ablage + ggf. laufender Build-Job (staat `job`), nie der Vollindex. - **`web/search.html`**: `chat_id` aus der URL lesen und bei jedem `panel_api`-Aufruf mitschicken; im Reiter-Modus (Kennung vorhanden) Auswahl nach `select`/`selection` setzen und beim Klick zurückschreiben — Fenster-Modus bleibt wie er ist; Reiter-CSS unter 560 px verfeinern; Build-Knopf behält `build`/`job` (Polling existiert bereits). - **SKILL.md**: Abschnitt „Plugin-Reiter im Seitenpanel" nach solidcraft-/comfyui-Muster (`[PLUGIN-PANEL: Retro-Spiele als macOS-App] …`-Marker, Stand über `status` mit `chat_id`, Bauen über `build` oder die CLI, Auswahl über `select`/`selection`); system_prompt.md nur falls nötig. - **Anleitung + Store**: Abschnitt in `docs/erste-schritte.md`; Version 0.8.0, `changelog` im Manifest, `store/changelog.md`-Abschnitt; Store-Seite aus `store-page.json` neu erzeugen (`store_page.py --check`). Veröffentlichung erst nach ausdrücklichem Wort. ## Taktung Ein Issue, ein PR, Version 0.8.0: Reiter ohne gemeinsame Auswahl wäre ein zweites Suchfenster im Chat — Auswahl, `status` und Seite gehören zusammen. Der Reiter-Bau-Flow (Build aus dem Reiter) nutzt nur vorhandene Befehle und ist kein eigener Schritt.
Author
Owner

PR #266 gemergt: feat(iris-gamebox): Gamebox-Seite als dritter Reiter im Seitenpanel — gemeinsame Auswahl, status/select/selection (0.8.0, #265)
#266

Commits:

  • feat(iris-gamebox): Gamebox-Seite als dritter Reiter im Seitenpanel — gemeinsame Auswahl, status/select/selection (0.8.0, #265)

Stand — Gamebox als dritter Reiter im Seitenpanel (0.8.0, #265)

Befund

web/search.html redete schon nur über cfg_token + panel_api — der Reiter-Vertrag (iris/Iris#169)
war fast erfüllt, bevor er angemeldet wurde. Lücken: keine status-Befehl, die Auswahl (state.sel)
lebte nur im JS, iris_min_version 2.0.0. Beim Testen des neuen select fiel ein alter Bug:
find_row meldete via die(), panel_api las davon nur die Exit-Zahl — detail/build antworteten
mit unbekanntem Handle seit 0.5.0 "error": "2".

Geändert

  • Manifest: side_panel: "web/search.html" (dieselbe Datei wie usage_web_view_path,
    comfyui-Muster), iris_min_version 2.0.1, select/selection/status in panel_api, Version 0.8.0.
  • Gemeinsame Auswahl: selection.json im Application Support (Bedienzustand neben config.json,
    überlebt Index-Neubau). CLI select HANDLE/--clear/selection; panel_api select (antwortet
    wie status → Reiter zeichnet ohne zweite Runde um) und selection; Segment-Wechsel löscht die
    Auswahl auch serverseitig.
  • status ohne Vollindex (Polling alle 5 s, load_index ≈ 18 MB): summary (Auswahl vorn) aus
    index-counts.json (neu, beim Index-Lauf mitgeschrieben; browse zieht sie bei Bestand vor 0.8.0
    nach), Apps über installed_apps(markers_only=True), Baufortschritt aus recent.json + Job-Datei;
    detail: Auswahl, Build, Apps, Quellen, Ablage.
  • web/search.html: chat_id aus der URL in jedem panel_api-Body; select() meldet die Auswahl
    ans Server-Gegenstück; restoreSelection() übernimmt beim Start Hermes' Auswahl; Reiter-CSS <560 px
    (Liste max 38 vh, Sidebar löst Sticky).
  • Bugfix: find_row wirft ValueError mit Text statt die(); CLI fängt zentral in main()
    (✗, Exit 2); panel_api-Fangstellen umgestellt — Fehlermeldung ist wieder lesbar.
  • SKILL.md-Abschnitt „Plugin-Reiter im Seitenpanel"; docs (erste-schritte, befehle); Manifest-changelog,
    store/changelog.md 0.8.0, Store-Seite neu erzeugt; PLAN.md + Daily Log.

Geprüft

  • Sandbox-HOME mit echten Bibliotheken: status = „Ausgewählt: Beyond Zork … · 10896 Spiele im
    Katalog · 0 Apps in der Ablage", Auswahl-/Build-Felder gefüllt; 5× status 0,3 s vs. 5× browse
    (Vollindex) 1,2 s — Polling ist billig.
  • select→selection→CLI-Rundlauf inkl. --clear; unbekanntes Handle mit Klartext (panel + CLI);
    Regression systems/detail/apps unverändert; node --check, py_compile,
    store_page.py --check, privacy_scan grün.

Nicht geprüft

  • Der Reiter in der echten Iris-App: Reiter erscheint, Polling, chat_id-Abweichungs-Fehler,
    restoreSelection gegen einen echten Hermes-Lauf, Layout am echten Panel → status/zu-testen.
  • iOS irrelevant (platforms: macos). Veröffentlichung wartet auf ausdrückliches Wort.

Grenzen

  • summary nennt ohne index-counts.json (Bestand vor 0.8.0, noch kein browse/Index-Lauf) keine
    Zeilenzahl — die Datei entsteht beim ersten Index- oder browse-Lauf.
PR #266 gemergt: feat(iris-gamebox): Gamebox-Seite als dritter Reiter im Seitenpanel — gemeinsame Auswahl, status/select/selection (0.8.0, #265) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/266 Commits: - feat(iris-gamebox): Gamebox-Seite als dritter Reiter im Seitenpanel — gemeinsame Auswahl, status/select/selection (0.8.0, #265) --- # Stand — Gamebox als dritter Reiter im Seitenpanel (0.8.0, #265) ## Befund `web/search.html` redete schon nur über `cfg_token` + panel_api — der Reiter-Vertrag (iris/Iris#169) war fast erfüllt, bevor er angemeldet wurde. Lücken: keine `status`-Befehl, die Auswahl (`state.sel`) lebte nur im JS, `iris_min_version` 2.0.0. Beim Testen des neuen `select` fiel ein alter Bug: `find_row` meldete via `die()`, panel_api las davon nur die Exit-Zahl — `detail`/`build` antworteten mit unbekanntem Handle seit 0.5.0 `"error": "2"`. ## Geändert - **Manifest**: `side_panel: "web/search.html"` (dieselbe Datei wie `usage_web_view_path`, comfyui-Muster), `iris_min_version` 2.0.1, `select`/`selection`/`status` in panel_api, Version 0.8.0. - **Gemeinsame Auswahl**: `selection.json` im Application Support (Bedienzustand neben config.json, überlebt Index-Neubau). CLI `select HANDLE`/`--clear`/`selection`; panel_api `select` (antwortet wie `status` → Reiter zeichnet ohne zweite Runde um) und `selection`; Segment-Wechsel löscht die Auswahl auch serverseitig. - **`status`** ohne Vollindex (Polling alle 5 s, load_index ≈ 18 MB): `summary` (Auswahl vorn) aus `index-counts.json` (neu, beim Index-Lauf mitgeschrieben; `browse` zieht sie bei Bestand vor 0.8.0 nach), Apps über `installed_apps(markers_only=True)`, Baufortschritt aus recent.json + Job-Datei; `detail`: Auswahl, Build, Apps, Quellen, Ablage. - **`web/search.html`**: `chat_id` aus der URL in jedem panel_api-Body; `select()` meldet die Auswahl ans Server-Gegenstück; `restoreSelection()` übernimmt beim Start Hermes' Auswahl; Reiter-CSS <560 px (Liste max 38 vh, Sidebar löst Sticky). - **Bugfix**: `find_row` wirft `ValueError` mit Text statt `die()`; CLI fängt zentral in `main()` (`✗`, Exit 2); panel_api-Fangstellen umgestellt — Fehlermeldung ist wieder lesbar. - SKILL.md-Abschnitt „Plugin-Reiter im Seitenpanel"; docs (erste-schritte, befehle); Manifest-`changelog`, `store/changelog.md` 0.8.0, Store-Seite neu erzeugt; PLAN.md + Daily Log. ## Geprüft - Sandbox-HOME mit echten Bibliotheken: `status` = „Ausgewählt: Beyond Zork … · 10896 Spiele im Katalog · 0 Apps in der Ablage", Auswahl-/Build-Felder gefüllt; **5× status 0,3 s** vs. 5× browse (Vollindex) 1,2 s — Polling ist billig. - select→selection→CLI-Rundlauf inkl. --clear; unbekanntes Handle mit Klartext (panel + CLI); Regression `systems`/`detail`/`apps` unverändert; `node --check`, `py_compile`, `store_page.py --check`, `privacy_scan` grün. ## Nicht geprüft - Der Reiter in der echten Iris-App: Reiter erscheint, Polling, `chat_id`-Abweichungs-Fehler, `restoreSelection` gegen einen echten Hermes-Lauf, Layout am echten Panel → `status/zu-testen`. - iOS irrelevant (platforms: macos). Veröffentlichung wartet auf ausdrückliches Wort. ## Grenzen - `summary` nennt ohne `index-counts.json` (Bestand vor 0.8.0, noch kein browse/Index-Lauf) keine Zeilenzahl — die Datei entsteht beim ersten Index- oder browse-Lauf.
Author
Owner

Veröffentlicht — 0.8.0 in der Registry (2026-10-25)

publish-plugins.sh iris-gamebox (Dry-Run vorher, Registry-Klon vorher frisch gezogen):
Registry-Commit 78f4768, Paket iris-gamebox-0.8.0.irisplugin (65 KB), Anleitung (erste Schritte
mit Reiter-Abschnitt, Befehle mit select/selection), Store-Changelog-Sektion 0.8.0 — 0.7.0
behält seine Sektion. Im veröffentlichten Paket verifiziert: version 0.8.0, iris_min_version 2.0.1, side_panel: web/search.html.

Was Nutzer sehen: Iris ab 2.0.1 bekommt 0.8.0 als Update; ältere Iris-Versionen nicht
(iris_min_version). Der Reiter erreicht damit die Betatester.

Offen (deshalb status/zu-testen): Reiter in der echten Iris-App (Erscheinen, Polling, Layout am
echten Panel), „davon eine App" gegen einen echten Hermes-Lauf, restoreSelection über einen
Chatwechsel hinweg.

## Veröffentlicht — 0.8.0 in der Registry (2026-10-25) `publish-plugins.sh iris-gamebox` (Dry-Run vorher, Registry-Klon vorher frisch gezogen): Registry-Commit `78f4768`, Paket `iris-gamebox-0.8.0.irisplugin` (65 KB), Anleitung (erste Schritte mit Reiter-Abschnitt, Befehle mit `select`/`selection`), Store-Changelog-Sektion 0.8.0 — 0.7.0 behält seine Sektion. Im veröffentlichten Paket verifiziert: `version 0.8.0`, `iris_min_version 2.0.1`, `side_panel: web/search.html`. **Was Nutzer sehen:** Iris ab 2.0.1 bekommt 0.8.0 als Update; ältere Iris-Versionen nicht (`iris_min_version`). Der Reiter erreicht damit die Betatester. **Offen (deshalb `status/zu-testen`):** Reiter in der echten Iris-App (Erscheinen, Polling, Layout am echten Panel), „davon eine App" gegen einen echten Hermes-Lauf, `restoreSelection` über einen Chatwechsel hinweg.
Author
Owner

Geschlossen auf ausdrücklichen Wunsch von Alf; das Label status/zu-testen wurde dabei entfernt. Stand: siehe die Kommentare oben (veröffentlicht bis iris-gamebox 0.10.5).

Geschlossen auf ausdrücklichen Wunsch von Alf; das Label status/zu-testen wurde dabei entfernt. Stand: siehe die Kommentare oben (veröffentlicht bis iris-gamebox 0.10.5).
alf closed this issue 2026-10-27 10:23:46 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
iris/iris-plugins#265
No description provided.