iris-claude-sessions: Memory von Claude Code anzeigen, bearbeiten, bereinigen, exportieren und importieren #203

Closed
opened 2026-10-22 12:55:35 +00:00 by alf · 18 comments
Owner

Ziel

Das Plugin iris-claude-sessions zeigt, bearbeitet, exportiert und importiert das Memory von Claude Code (~/.claude/projects/<kodierter Pfad>/memory/). Der Bearbeiten-Knopf öffnet einen Markdown-Editor mit Zusatzfunktionen. So lässt sich ein Memory auf eine andere Iris übertragen und vorher von Privatem bereinigen.

Erweiterung des freigegebenen Plans (Issue #167, dort „Nicht Teil“ nicht berührt); der Plan ist gesperrt, deshalb eigenes Issue.

Befund

  • Memory sind reine Markdown-Dateien: MEMORY.md (Index, eine Zeile pro Eintrag) plus eine Datei je Fakt mit Frontmatter (name, description, metadata.type = user | feedback | project | reference), Querverweise [[name]].
  • Der Ordnername kodiert den absoluten Projektpfad; auf einem anderen Rechner heißt das Projekt anders.
  • Memorys enthalten viel Privates.

Entwurf

Neuer Plugin-Blocktyp memory_editor (WebView, Muster editable_table/mask_editor, provided_block_types), kein App-Umbau für die Oberfläche.

  • Einheit: ein Projekt-Memory als Ganzes. Links Dateiliste (MEMORY.md + Einzeldateien), rechts Markdown-Editor.
  • Privatinfos prüfen: deterministisch in der Web-Ansicht, kein LLM. Muster für E-Mail, Telefon, IBAN, Tokens, IPs/Hostnamen, Pfade mit Home-Verzeichnis, Wörter aus ~/.config/iris-private-words.txt. Funde markiert, Entfernen je Fund oder alle.
  • Importieren: .md oder .zip, Wahl „Ersetzen“ oder „Mergen“. Merge-Schlüssel ist name:; bei Konflikt je Datei Behalten / Übernehmen / Beide; MEMORY.md wird neu aufgebaut. Das Ergebnis steht im Editor, geschrieben wird erst bei „Speichern“.
  • Exportieren: Bundle (zip) der gewählten Dateien; Zielort noch zu klären (siehe unten).
  • Abbrechen / Speichern: Der Klick läuft ohne Chat-Modell: memory edit schreibt das Canvas und startet einen losgelösten Wächter, der auf <Workspace>/canvas_response.json wartet (30 Minuten), selbst speichert und memory_ergebnis.json schreibt; auswahl gibt das Ergebnis aus, das Modell meldet nur dieses. Vor dem Speichern liegt eine Kopie der alten Fassung unter sicherungen/<Projekt>/<Zeit>/; nach dem Schreiben wird zur Kontrolle zurückgelesen. (Gebaut und am echten Klick auf dem MacBook bestätigt, Version 0.2.2.)
  • Skript-Befehle: memory list, memory read, memory save, memory export, memory import; Standardbibliothek, Tests gegen ein Testverzeichnis (Umgebungsvariable), nie gegen das echte ~/.claude.

Risiken / offene Fragen

  1. Speichern über das LLM gelöst (0.2.2): Ein Skript kann den Klick selbst verarbeiten, weil die App canvas_response.json vor der Nachricht an das Modell schreibt. Ein wartender Hermes-Aufruf trägt nicht (das Modell setzte timeout: 60); der losgelöste Wächter schon. Kein App-Umbau nötig.
  2. Export/Import aus der WebView. Bridges für Dateilesen und Drag & Drop existieren, ein Speichern-Dialog nicht. Zu prüfen: Export in Workspace oder Downloads per Skript und Pfad im Chat.
  3. Importziel auf einer anderen Iris: Zielprojekt wählen oder Pfad umsetzen.
  4. Der Privat-Scan der Registry gilt nicht automatisch für exportierte Memorys; der Editor-Check ist der Schutz.

Nicht Teil

  • Hermes-Memory, andere Agenten, Linux-Server (wie V1).
  • LLM-Urteil zur Privatsphäre (nur Skript/Regeln).
  • Endgültiges Löschen (nur Papierkorb).

Reihenfolge

  1. ✔ Memory-Parser, memory list/read/save mit Tests (0.2.0).
  2. ✔ Privat-Check (Muster als Daten, privat_muster.json) mit Tests.
  3. ✔ Merge/Ersetzen und memory import/export mit Tests.
  4. ✔ Speichern ohne LLM: memory edit mit Wächter, einfaches Textfeld im Canvas (0.2.0 bis 0.2.2, MacBook-Test bestanden).
  5. WebView-Block memory_editor (Dateiliste, Markdown-Editor, Privat-Check-Knöpfe, Import-Vorschau, Export) statt des Textfeldes.
  6. Canvas-Einstieg (Projekt- und Dateiliste mit „Bearbeiten“) und Klärung Risiko 2 (Export/Import aus der WebView).
## Ziel Das Plugin `iris-claude-sessions` zeigt, bearbeitet, exportiert und importiert das **Memory von Claude Code** (`~/.claude/projects/<kodierter Pfad>/memory/`). Der Bearbeiten-Knopf öffnet einen Markdown-Editor mit Zusatzfunktionen. So lässt sich ein Memory auf eine andere Iris übertragen und vorher von Privatem bereinigen. Erweiterung des freigegebenen Plans (Issue #167, dort „Nicht Teil“ nicht berührt); der Plan ist gesperrt, deshalb eigenes Issue. ## Befund - Memory sind reine Markdown-Dateien: `MEMORY.md` (Index, eine Zeile pro Eintrag) plus eine Datei je Fakt mit Frontmatter (`name`, `description`, `metadata.type` = user | feedback | project | reference), Querverweise `[[name]]`. - Der Ordnername kodiert den absoluten Projektpfad; auf einem anderen Rechner heißt das Projekt anders. - Memorys enthalten viel Privates. ## Entwurf Neuer Plugin-Blocktyp `memory_editor` (WebView, Muster `editable_table`/`mask_editor`, `provided_block_types`), kein App-Umbau für die Oberfläche. - **Einheit:** ein Projekt-Memory als Ganzes. Links Dateiliste (`MEMORY.md` + Einzeldateien), rechts Markdown-Editor. - **Privatinfos prüfen:** deterministisch in der Web-Ansicht, kein LLM. Muster für E-Mail, Telefon, IBAN, Tokens, IPs/Hostnamen, Pfade mit Home-Verzeichnis, Wörter aus `~/.config/iris-private-words.txt`. Funde markiert, Entfernen je Fund oder alle. - **Importieren:** `.md` oder `.zip`, Wahl „Ersetzen“ oder „Mergen“. Merge-Schlüssel ist `name:`; bei Konflikt je Datei Behalten / Übernehmen / Beide; `MEMORY.md` wird neu aufgebaut. Das Ergebnis steht im Editor, geschrieben wird erst bei „Speichern“. - **Exportieren:** Bundle (zip) der gewählten Dateien; Zielort noch zu klären (siehe unten). - **Abbrechen / Speichern:** Der Klick läuft **ohne Chat-Modell**: `memory edit` schreibt das Canvas und startet einen losgelösten Wächter, der auf `<Workspace>/canvas_response.json` wartet (30 Minuten), selbst speichert und `memory_ergebnis.json` schreibt; `auswahl` gibt das Ergebnis aus, das Modell meldet nur dieses. Vor dem Speichern liegt eine Kopie der alten Fassung unter `sicherungen/<Projekt>/<Zeit>/`; nach dem Schreiben wird zur Kontrolle zurückgelesen. (Gebaut und am echten Klick auf dem MacBook bestätigt, Version 0.2.2.) - Skript-Befehle: `memory list`, `memory read`, `memory save`, `memory export`, `memory import`; Standardbibliothek, Tests gegen ein Testverzeichnis (Umgebungsvariable), nie gegen das echte `~/.claude`. ## Risiken / offene Fragen 1. ~~Speichern über das LLM~~ **gelöst (0.2.2):** Ein Skript kann den Klick selbst verarbeiten, weil die App `canvas_response.json` vor der Nachricht an das Modell schreibt. Ein wartender Hermes-Aufruf trägt nicht (das Modell setzte `timeout: 60`); der losgelöste Wächter schon. Kein App-Umbau nötig. 2. **Export/Import aus der WebView.** Bridges für Dateilesen und Drag & Drop existieren, ein Speichern-Dialog nicht. Zu prüfen: Export in Workspace oder Downloads per Skript und Pfad im Chat. 3. **Importziel auf einer anderen Iris:** Zielprojekt wählen oder Pfad umsetzen. 4. Der Privat-Scan der Registry gilt nicht automatisch für exportierte Memorys; der Editor-Check ist der Schutz. ## Nicht Teil - Hermes-Memory, andere Agenten, Linux-Server (wie V1). - LLM-Urteil zur Privatsphäre (nur Skript/Regeln). - Endgültiges Löschen (nur Papierkorb). ## Reihenfolge 1. ✔ Memory-Parser, `memory list/read/save` mit Tests (0.2.0). 2. ✔ Privat-Check (Muster als Daten, `privat_muster.json`) mit Tests. 3. ✔ Merge/Ersetzen und `memory import/export` mit Tests. 4. ✔ Speichern ohne LLM: `memory edit` mit Wächter, einfaches Textfeld im Canvas (0.2.0 bis 0.2.2, MacBook-Test bestanden). 5. WebView-Block `memory_editor` (Dateiliste, Markdown-Editor, Privat-Check-Knöpfe, Import-Vorschau, Export) statt des Textfeldes. 6. Canvas-Einstieg (Projekt- und Dateiliste mit „Bearbeiten“) und Klärung Risiko 2 (Export/Import aus der WebView).
Author
Owner

PR #204 gemergt: feat(claude-sessions): Memory von Claude Code lesen, prüfen und speichern (#203)
#204

Commits:

  • feat(claude-sessions): Memory von Claude Code lesen, prüfen und speichern (#203)

Stand: Schritte 1 und 2 (Grundlage ohne Oberfläche).

Geändert

  • claude_memory.py (neu): Memory-Projekte finden, lesen (Frontmatter tolerant, Rohtext byte-genau), speichern, Privat-Check.
  • claude_sessions.py: neuer Befehl memory list | read | check | save; Fehler, projekte_dir, daten_dir, papierkorb_dir kommen jetzt aus claude_memory.py.
  • privat_muster.json (neu): Muster für den Privat-Check, einzige Quelle für Skript und späteren Editor (nur Regex-Syntax, die Python und JavaScript gleich lesen).

Verhalten von memory save

  • Ersetzt das Memory des Projekts durch genau die übergebenen Dateien, sichert das alte vollständig im Papierkorb (papierkorb/memory/<Projekt>/<Zeit>), entfernt nicht mehr genannte .md-Dateien, lässt Fremddateien stehen, liest nach dem Schreiben zur Kontrolle zurück.
  • Verweigert Pfade, fremde Endungen, doppelte Namen und kaputtes JSON, ohne etwas zu schreiben.
  • Projektname darf ohne führendes „-“ angegeben werden (argparse läse es sonst als Option) oder als eindeutiger Teil von Ordnername oder Arbeitsverzeichnis.

Geprüft

  • 49 Tests grün (16 neu für Memory und Privat-Check, gegen erfundene Dateien in einem Testverzeichnis; die 33 bisherigen unverändert grün).
  • Schreibgeschützter Lauf von memory list und memory check gegen das echte Memory (168 Dateien im größten Projekt): Format passt. Der Lauf deckte drei Fehlalarme auf (hf_hub_download, 127.0.0.1, Bundle-ID ….internal), die Muster sind nachgeschärft und mit Tests belegt.
  • Zwei Speichervorgänge in derselben Sekunde kollidierten beim Sicherungsordner (vom Test gefunden); der Name enthält jetzt Mikrosekunden.

Nicht geprüft

  • memory save nie gegen das echte ~/.claude (bewusst nur Testverzeichnis).
  • Die Muster in JavaScript (der Editor kommt in Schritt 4); die Prüfung stellt nur sicher, dass keine Python-only-Syntax drinsteht.
  • pruefen meldet drei Manifest-Punkte (Version, Changelog, system_prompt): betreffen die Veröffentlichung, nicht diesen Schritt.

Offen

  • Schritt 3: Merge/Ersetzen-Logik, memory import/export.
  • Schritt 4: WebView-Block memory_editor. Schritt 5: Canvas-Anbindung und die zwei Risiken aus der Beschreibung (Speichern ohne LLM, Export aus der WebView).
  • SKILL.md kennt den Befehl memory noch nicht; kommt mit der Canvas-Anbindung.
PR #204 gemergt: feat(claude-sessions): Memory von Claude Code lesen, prüfen und speichern (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/204 Commits: - feat(claude-sessions): Memory von Claude Code lesen, prüfen und speichern (#203) --- **Stand: Schritte 1 und 2 (Grundlage ohne Oberfläche).** **Geändert** - `claude_memory.py` (neu): Memory-Projekte finden, lesen (Frontmatter tolerant, Rohtext byte-genau), speichern, Privat-Check. - `claude_sessions.py`: neuer Befehl `memory list | read | check | save`; `Fehler`, `projekte_dir`, `daten_dir`, `papierkorb_dir` kommen jetzt aus `claude_memory.py`. - `privat_muster.json` (neu): Muster für den Privat-Check, einzige Quelle für Skript und späteren Editor (nur Regex-Syntax, die Python und JavaScript gleich lesen). **Verhalten von `memory save`** - Ersetzt das Memory des Projekts durch genau die übergebenen Dateien, sichert das alte vollständig im Papierkorb (`papierkorb/memory/<Projekt>/<Zeit>`), entfernt nicht mehr genannte `.md`-Dateien, lässt Fremddateien stehen, liest nach dem Schreiben zur Kontrolle zurück. - Verweigert Pfade, fremde Endungen, doppelte Namen und kaputtes JSON, ohne etwas zu schreiben. - Projektname darf ohne führendes „-“ angegeben werden (argparse läse es sonst als Option) oder als eindeutiger Teil von Ordnername oder Arbeitsverzeichnis. **Geprüft** - 49 Tests grün (16 neu für Memory und Privat-Check, gegen erfundene Dateien in einem Testverzeichnis; die 33 bisherigen unverändert grün). - Schreibgeschützter Lauf von `memory list` und `memory check` gegen das echte Memory (168 Dateien im größten Projekt): Format passt. Der Lauf deckte drei Fehlalarme auf (`hf_hub_download`, `127.0.0.1`, Bundle-ID `….internal`), die Muster sind nachgeschärft und mit Tests belegt. - Zwei Speichervorgänge in derselben Sekunde kollidierten beim Sicherungsordner (vom Test gefunden); der Name enthält jetzt Mikrosekunden. **Nicht geprüft** - `memory save` nie gegen das echte `~/.claude` (bewusst nur Testverzeichnis). - Die Muster in JavaScript (der Editor kommt in Schritt 4); die Prüfung stellt nur sicher, dass keine Python-only-Syntax drinsteht. - `pruefen` meldet drei Manifest-Punkte (Version, Changelog, system_prompt): betreffen die Veröffentlichung, nicht diesen Schritt. **Offen** - Schritt 3: Merge/Ersetzen-Logik, `memory import/export`. - Schritt 4: WebView-Block `memory_editor`. Schritt 5: Canvas-Anbindung und die zwei Risiken aus der Beschreibung (Speichern ohne LLM, Export aus der WebView). - SKILL.md kennt den Befehl `memory` noch nicht; kommt mit der Canvas-Anbindung.
Author
Owner

PR #205 gemergt: feat(claude-sessions): Memory zusammenführen, ersetzen, exportieren und importieren (#203)
#205

Commits:

  • feat(claude-sessions): Memory zusammenführen, ersetzen, exportieren und importieren (#203)

Stand: Schritt 3 (Zusammenführen, Ersetzen, Export, Import) — weiterhin ohne Oberfläche.

Geändert

  • claude_memory.py: bundle_lesen, exportieren, zusammenfuehren und Hilfen (Index-Zeilen, freie Dateinamen).
  • claude_sessions.py: memory export PROJEKT --out X.zip [--datei NAME …] und memory import PROJEKT QUELLE --modus ersetzen|mergen [--konflikt NAME=ENTSCHEIDUNG …] [--standard …] [--speichern].

Verhalten

  • Import schreibt nichts, sondern liefert den Vorschlag (dateien, hinzugefuegt, geaendert, entfernt, unveraendert, konflikte, uebersprungen); er ist die Grundlage für die Anzeige im Editor. Erst --speichern (später: der Knopf „Speichern“) schreibt, über memory save mit Sicherung im Papierkorb.
  • Ersetzen: genau die importierten Dateien; MEMORY.md aus dem Bundle, sonst neu gebaut. Bisheriges fällt weg und liegt danach im Papierkorb.
  • Mergen: Identität ist das Feld name: (nicht der Dateiname). Neue Namen kommen dazu, der Index bekommt nur die neuen Zeilen, der Rest bleibt unberührt. Gleicher Name mit anderem Inhalt = Konflikt, Entscheidung je Name: behalten (Standard, nie ein Verlust), uebernehmen (Inhalt und Indexzeile ersetzt), beide (Kopie <name>-import.md mit name: … (Import)). Gleicher Dateiname bei anderem Namen bekommt -2. Zweimal dasselbe mergen ändert nichts.
  • Bundle: .zip mit iris-memory.json (Format, Zeitpunkt, Anzahl; keine Pfade) plus die .md-Dateien; ohne Auswahl mit MEMORY.md, mit Auswahl ohne Index (wird beim Import gebaut). Export überschreibt nie. Import liest auch eine einzelne .md.
  • Schutz beim Lesen: nur einfache .md-Namen auf oberster Ebene, Größenlimits (1 MB je Datei, 20 MB gesamt), Pfade wie ../x.md, Unterordner, __MACOSX, fremde Endungen und Nicht-UTF-8 werden übersprungen und im Ergebnis gemeldet.

Geprüft

  • 66 Tests grün (17 neu: Export, Rundreise, Vorschlag ohne Schreiben, Ersetzen, jeder Konfliktfall, Idempotenz, Projekt ohne Memory, einzelne .md, gefährliche und kaputte Quellen).
  • Rundlauf mit den echten Daten, ohne zu schreiben: Export des größten Projekts (168 Dateien, 276 KB) in den Scratchpad, Importvorschlag dagegen — Mergen und Ersetzen: 0 hinzugefügt/geändert/entfernt, alles unverändert (byte-genau). In ein anderes Projekt gemergt: 167 neue Einträge, ein Index.

Nicht geprüft

  • Kein Schreiben ins echte ~/.claude (--speichern nur gegen Testverzeichnisse).
  • Konflikte und beide nur mit erfundenen Daten.
  • Einen Export mit dem Privat-Check zu verbinden ist nicht Teil des Befehls: Bereinigt wird im Editor, export liest den Stand auf der Platte.

Offen

  • Schritt 4: WebView-Block memory_editor (Dateiliste, Markdown-Editor, Privat-Check mit privat_muster.json, Import-Vorschau, Abbrechen/Speichern).
  • Schritt 5: Canvas-Anbindung, SKILL.md/Systemprompt, Klärung der zwei Risiken (Speichern ohne LLM, Export/Import aus der WebView).
PR #205 gemergt: feat(claude-sessions): Memory zusammenführen, ersetzen, exportieren und importieren (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/205 Commits: - feat(claude-sessions): Memory zusammenführen, ersetzen, exportieren und importieren (#203) --- **Stand: Schritt 3 (Zusammenführen, Ersetzen, Export, Import) — weiterhin ohne Oberfläche.** **Geändert** - `claude_memory.py`: `bundle_lesen`, `exportieren`, `zusammenfuehren` und Hilfen (Index-Zeilen, freie Dateinamen). - `claude_sessions.py`: `memory export PROJEKT --out X.zip [--datei NAME …]` und `memory import PROJEKT QUELLE --modus ersetzen|mergen [--konflikt NAME=ENTSCHEIDUNG …] [--standard …] [--speichern]`. **Verhalten** - **Import schreibt nichts**, sondern liefert den Vorschlag (`dateien`, `hinzugefuegt`, `geaendert`, `entfernt`, `unveraendert`, `konflikte`, `uebersprungen`); er ist die Grundlage für die Anzeige im Editor. Erst `--speichern` (später: der Knopf „Speichern“) schreibt, über `memory save` mit Sicherung im Papierkorb. - **Ersetzen:** genau die importierten Dateien; MEMORY.md aus dem Bundle, sonst neu gebaut. Bisheriges fällt weg und liegt danach im Papierkorb. - **Mergen:** Identität ist das Feld `name:` (nicht der Dateiname). Neue Namen kommen dazu, der Index bekommt nur die neuen Zeilen, der Rest bleibt unberührt. Gleicher Name mit anderem Inhalt = Konflikt, Entscheidung je Name: `behalten` (Standard, nie ein Verlust), `uebernehmen` (Inhalt und Indexzeile ersetzt), `beide` (Kopie `<name>-import.md` mit `name: … (Import)`). Gleicher Dateiname bei anderem Namen bekommt `-2`. Zweimal dasselbe mergen ändert nichts. - **Bundle:** .zip mit `iris-memory.json` (Format, Zeitpunkt, Anzahl; keine Pfade) plus die .md-Dateien; ohne Auswahl mit MEMORY.md, mit Auswahl ohne Index (wird beim Import gebaut). Export überschreibt nie. Import liest auch eine einzelne .md. - **Schutz beim Lesen:** nur einfache .md-Namen auf oberster Ebene, Größenlimits (1 MB je Datei, 20 MB gesamt), Pfade wie `../x.md`, Unterordner, `__MACOSX`, fremde Endungen und Nicht-UTF-8 werden übersprungen und im Ergebnis gemeldet. **Geprüft** - 66 Tests grün (17 neu: Export, Rundreise, Vorschlag ohne Schreiben, Ersetzen, jeder Konfliktfall, Idempotenz, Projekt ohne Memory, einzelne .md, gefährliche und kaputte Quellen). - Rundlauf mit den echten Daten, ohne zu schreiben: Export des größten Projekts (168 Dateien, 276 KB) in den Scratchpad, Importvorschlag dagegen — Mergen und Ersetzen: 0 hinzugefügt/geändert/entfernt, alles unverändert (byte-genau). In ein anderes Projekt gemergt: 167 neue Einträge, ein Index. **Nicht geprüft** - Kein Schreiben ins echte `~/.claude` (`--speichern` nur gegen Testverzeichnisse). - Konflikte und `beide` nur mit erfundenen Daten. - Einen Export mit dem Privat-Check zu verbinden ist nicht Teil des Befehls: Bereinigt wird im Editor, `export` liest den Stand auf der Platte. **Offen** - Schritt 4: WebView-Block `memory_editor` (Dateiliste, Markdown-Editor, Privat-Check mit `privat_muster.json`, Import-Vorschau, Abbrechen/Speichern). - Schritt 5: Canvas-Anbindung, SKILL.md/Systemprompt, Klärung der zwei Risiken (Speichern ohne LLM, Export/Import aus der WebView).
Author
Owner

PR #206 gemergt: feat(claude-sessions): memory edit — Speichern per Canvas ohne Chat-Modell (#203)
#206

Commits:

  • feat(claude-sessions): memory edit — Speichern per Canvas ohne Chat-Modell (#203)

Stand: „Speichern ohne LLM“ geprüft und als Mechanismus gebaut (memory edit). Zum Testen auf dem MacBook gedacht; Oberfläche ist hier noch ein einfaches Canvas, nicht der spätere Editor.

Befund (Code gelesen, App nicht gestartet)

  • Ein Canvas-Klick läuft heute so: AgentJobManager.submitCanvas schreibt zuerst <Workspace>/canvas_response.json (wenn der Snapshot ein responseFilePath hat, was die Datei-Schnittstelle immer setzt) und schickt danach den Text „Canvas-Auswahl bestätigt: …“ als Nachricht an Hermes. Die Antwortdatei existiert also vor und unabhängig vom LLM. Die Linux-Server-Variante (canvas_routes.py) schreibt dieselbe Datei.
  • Der Canvas-Watcher der App liest canvas_request.json während eines laufenden Hermes-Turns (Kommentar in AgentJob.swift: ein blockierter Tool-Aufruf darf dabei beliebig lange warten).
  • Folge: Ein Skript kann das Canvas schreiben und selbst auf canvas_response.json warten. Der Klick wird dann vom Skript verarbeitet, nicht vom Modell. Kein App-Umbau nötig, daher kein Issue in iris/Iris.
  • Grenzen: Ein wartender Terminal-Aufruf in Hermes darf höchstens 600 s dauern (FOREGROUND_MAX_TIMEOUT); danach wird er zum Hintergrundprozess. Der Watcher der App läuft nur während eines Turns, weitere Canvas nach Turn-Ende würden also nicht mehr angezeigt. Die Nachricht „Canvas-Auswahl bestätigt“ geht trotzdem noch an das Modell (nach dem Turn); der Prompt sagt ihm, dass dann nichts mehr zu tun ist, und auswahl meldet memory_save/memory_cancel als erledigt.

Geändert

  • memory edit PROJEKT DATEI --workspace <WORKSPACE> [--timeout S]: schreibt das Canvas (Inhalt als mehrzeiliges Feld, Knöpfe Speichern/Abbrechen, Privat-Check-Funde oben), wartet auf die Antwort der App und setzt sie um. Speichern: datei_speichern (ganzes Memory vorher im Papierkorb gesichert, nur diese Datei neu geschrieben, zur Kontrolle zurückgelesen). Status: gespeichert, abgebrochen, unveraendert, offen.
  • Bei Zeitablauf (Standard 540 s) bleibt das Canvas offen, Status offen; memory apply PROJEKT DATEI --antwort <WORKSPACE>/canvas_response.json speichert später, wenn der Nutzer doch klickt (liest den Text aus der Datei, das Modell tippt nichts ab).
  • Alte canvas_response.json wird vor dem Schreiben entfernt (sonst gälte sie als Klick auf das neue Canvas); halb geschriebene Antworten werden abgewartet; ein Fehler der App (error) bricht mit Meldung ab.
  • SKILL.md und Systemprompt: Memory-Befehle, „ein Aufruf mit timeout 600“, danach nur die Skript-Ausgabe melden.

Geprüft

  • 74 Tests grün (8 neu): Der Test spielt die App, indem er auf canvas_request.json wartet und canvas_response.json schreibt: Speichern (inkl. abgeschnittenem Zeilenende), Abbrechen, unveränderter Text, alte Antwort zählt nicht, halbe Datei, Zeitablauf plus apply, Fehlerantwort, Privat-Check im Canvas, auswahl bei memory_*-Klicks.

Nicht geprüft (Test auf dem MacBook, Iris dort pullen/installieren)

  1. Ob Hermes den wartenden Aufruf mit timeout 600 wirklich so absetzt und der Turn dabei offen bleibt.
  2. Ob das Canvas in der App erscheint und der Klick „Speichern“ während des wartenden Aufrufs ankommt (Job-Status running: die App stellt die Nachricht zurück, schreibt aber die Antwortdatei sofort).
  3. Ob die Datei danach geändert ist und das alte Memory im Papierkorb liegt (~/Library/Application Support/Iris/iris-claude-sessions/papierkorb/memory/…).
  4. Was das Modell nach dem Turn mit der zurückgestellten Nachricht „Canvas-Auswahl bestätigt“ macht (soll nur bestätigen).
  5. Die lokale Iris-App wurde für diese Arbeit weder gebaut noch gestartet.

Testanleitung: Im Chat sagen: „Bearbeite die Claude-Memory-Datei <Name>.md im Projekt <Projekt>.“ Canvas erscheint → Text ändern → „Speichern“. Erwartet: Skript-Ausgabe gespeichert im Chat, Datei geändert, Sicherung im Papierkorb. Danach dasselbe mit „Abbrechen“.

Offen

  • Wenn der Test besteht: WebView-Block memory_editor (Schritt 4) anstelle des einfachen Textfeldes; der Mechanismus (Skript wartet auf die Antwortdatei, Editor-Stand im Feld <block>.result) bleibt derselbe.
  • Bei einem Misserfolg von 1 oder 2: Fallback ist apply; die direkte Lösung wäre ein App-Hook für Canvas-Klicks (Issue in iris/Iris).
PR #206 gemergt: feat(claude-sessions): memory edit — Speichern per Canvas ohne Chat-Modell (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/206 Commits: - feat(claude-sessions): memory edit — Speichern per Canvas ohne Chat-Modell (#203) --- **Stand: „Speichern ohne LLM“ geprüft und als Mechanismus gebaut (`memory edit`).** Zum Testen auf dem MacBook gedacht; Oberfläche ist hier noch ein einfaches Canvas, nicht der spätere Editor. **Befund (Code gelesen, App nicht gestartet)** - Ein Canvas-Klick läuft heute so: `AgentJobManager.submitCanvas` schreibt zuerst `<Workspace>/canvas_response.json` (wenn der Snapshot ein `responseFilePath` hat, was die Datei-Schnittstelle immer setzt) und schickt danach den Text „Canvas-Auswahl bestätigt: …“ als Nachricht an Hermes. Die Antwortdatei existiert also vor und unabhängig vom LLM. Die Linux-Server-Variante (`canvas_routes.py`) schreibt dieselbe Datei. - Der Canvas-Watcher der App liest `canvas_request.json` während eines laufenden Hermes-Turns (Kommentar in `AgentJob.swift`: ein blockierter Tool-Aufruf darf dabei beliebig lange warten). - Folge: **Ein Skript kann das Canvas schreiben und selbst auf `canvas_response.json` warten.** Der Klick wird dann vom Skript verarbeitet, nicht vom Modell. Kein App-Umbau nötig, daher kein Issue in iris/Iris. - Grenzen: Ein wartender Terminal-Aufruf in Hermes darf höchstens 600 s dauern (`FOREGROUND_MAX_TIMEOUT`); danach wird er zum Hintergrundprozess. Der Watcher der App läuft nur während eines Turns, weitere Canvas nach Turn-Ende würden also nicht mehr angezeigt. Die Nachricht „Canvas-Auswahl bestätigt“ geht trotzdem noch an das Modell (nach dem Turn); der Prompt sagt ihm, dass dann nichts mehr zu tun ist, und `auswahl` meldet `memory_save`/`memory_cancel` als erledigt. **Geändert** - `memory edit PROJEKT DATEI --workspace <WORKSPACE> [--timeout S]`: schreibt das Canvas (Inhalt als mehrzeiliges Feld, Knöpfe Speichern/Abbrechen, Privat-Check-Funde oben), wartet auf die Antwort der App und setzt sie um. Speichern: `datei_speichern` (ganzes Memory vorher im Papierkorb gesichert, nur diese Datei neu geschrieben, zur Kontrolle zurückgelesen). Status: `gespeichert`, `abgebrochen`, `unveraendert`, `offen`. - Bei Zeitablauf (Standard 540 s) bleibt das Canvas offen, Status `offen`; `memory apply PROJEKT DATEI --antwort <WORKSPACE>/canvas_response.json` speichert später, wenn der Nutzer doch klickt (liest den Text aus der Datei, das Modell tippt nichts ab). - Alte `canvas_response.json` wird vor dem Schreiben entfernt (sonst gälte sie als Klick auf das neue Canvas); halb geschriebene Antworten werden abgewartet; ein Fehler der App (`error`) bricht mit Meldung ab. - SKILL.md und Systemprompt: Memory-Befehle, „ein Aufruf mit timeout 600“, danach nur die Skript-Ausgabe melden. **Geprüft** - 74 Tests grün (8 neu): Der Test spielt die App, indem er auf `canvas_request.json` wartet und `canvas_response.json` schreibt: Speichern (inkl. abgeschnittenem Zeilenende), Abbrechen, unveränderter Text, alte Antwort zählt nicht, halbe Datei, Zeitablauf plus `apply`, Fehlerantwort, Privat-Check im Canvas, `auswahl` bei memory_*-Klicks. **Nicht geprüft (Test auf dem MacBook, Iris dort pullen/installieren)** 1. Ob Hermes den wartenden Aufruf mit `timeout` 600 wirklich so absetzt und der Turn dabei offen bleibt. 2. Ob das Canvas in der App erscheint und der Klick „Speichern“ **während** des wartenden Aufrufs ankommt (Job-Status `running`: die App stellt die Nachricht zurück, schreibt aber die Antwortdatei sofort). 3. Ob die Datei danach geändert ist und das alte Memory im Papierkorb liegt (`~/Library/Application Support/Iris/iris-claude-sessions/papierkorb/memory/…`). 4. Was das Modell nach dem Turn mit der zurückgestellten Nachricht „Canvas-Auswahl bestätigt“ macht (soll nur bestätigen). 5. Die lokale Iris-App wurde für diese Arbeit weder gebaut noch gestartet. **Testanleitung:** Im Chat sagen: „Bearbeite die Claude-Memory-Datei `<Name>.md` im Projekt `<Projekt>`.“ Canvas erscheint → Text ändern → „Speichern“. Erwartet: Skript-Ausgabe `gespeichert` im Chat, Datei geändert, Sicherung im Papierkorb. Danach dasselbe mit „Abbrechen“. **Offen** - Wenn der Test besteht: WebView-Block `memory_editor` (Schritt 4) anstelle des einfachen Textfeldes; der Mechanismus (Skript wartet auf die Antwortdatei, Editor-Stand im Feld `<block>.result`) bleibt derselbe. - Bei einem Misserfolg von 1 oder 2: Fallback ist `apply`; die direkte Lösung wäre ein App-Hook für Canvas-Klicks (Issue in iris/Iris).
Author
Owner

PR #207 gemergt: chore(claude-sessions): Version 0.2.0 — Memory von Claude Code (#203)
#207

Commits:

  • chore(claude-sessions): Version 0.2.0 — Memory von Claude Code (#203)

Stand: Version 0.2.0 vorbereitet und veröffentlicht (auf Alfs ausdrücklichen Auftrag „Veröffentliche“, zum Test auf dem MacBook).

Geändert: plugin.json (Version 0.2.0, Änderungstext), store/changelog.md (Abschnitt 0.2.0), docs/erste-schritte.md (Abschnitt Memory), store/description.md (ein Punkt), PLAN.md (Versionsliste, Stand, Lessons Learned).

Geprüft: 74 Tests grün; publish-plugins.sh iris-claude-sessions --dry-run ohne Fehler (Build, Datenschutz-Scan über Manifest, Store-Texte, Anleitung und Paket).

Nicht geprüft: Alles aus dem Stand-Kommentar zu memory edit bleibt offen (Test auf dem MacBook: wartender Aufruf mit timeout 600, Klick während des Wartens, Papierkorb-Sicherung, Verhalten des Modells nach dem Turn). Der Marktplatz-Weg (Update im Plugin-Manager) ist nicht ausprobiert.

Grenzen: Erste Fassung mit einfachem Textfeld. Keine Store-Bilder. Das Issue bleibt offen (status/zu-testen).

Offen: WebView-Editor memory_editor mit Privat-Check-Knöpfen, Import-Vorschau und Export-Knopf; Canvas-Einstieg für Memory (bisher nur per Chat-Befehl).

PR #207 gemergt: chore(claude-sessions): Version 0.2.0 — Memory von Claude Code (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/207 Commits: - chore(claude-sessions): Version 0.2.0 — Memory von Claude Code (#203) --- **Stand: Version 0.2.0 vorbereitet und veröffentlicht (auf Alfs ausdrücklichen Auftrag „Veröffentliche“, zum Test auf dem MacBook).** **Geändert:** `plugin.json` (Version 0.2.0, Änderungstext), `store/changelog.md` (Abschnitt 0.2.0), `docs/erste-schritte.md` (Abschnitt Memory), `store/description.md` (ein Punkt), `PLAN.md` (Versionsliste, Stand, Lessons Learned). **Geprüft:** 74 Tests grün; `publish-plugins.sh iris-claude-sessions --dry-run` ohne Fehler (Build, Datenschutz-Scan über Manifest, Store-Texte, Anleitung und Paket). **Nicht geprüft:** Alles aus dem Stand-Kommentar zu `memory edit` bleibt offen (Test auf dem MacBook: wartender Aufruf mit timeout 600, Klick während des Wartens, Papierkorb-Sicherung, Verhalten des Modells nach dem Turn). Der Marktplatz-Weg (Update im Plugin-Manager) ist nicht ausprobiert. **Grenzen:** Erste Fassung mit einfachem Textfeld. Keine Store-Bilder. Das Issue bleibt offen (`status/zu-testen`). **Offen:** WebView-Editor `memory_editor` mit Privat-Check-Knöpfen, Import-Vorschau und Export-Knopf; Canvas-Einstieg für Memory (bisher nur per Chat-Befehl).
Author
Owner

PR #208 gemergt: fix(claude-sessions): memory edit mit losgelöstem Wächter statt wartendem Aufruf (#203)
#208

Commits:

  • fix(claude-sessions): memory edit mit losgelöstem Wächter statt wartendem Aufruf (#203)

Stand: Praxistest auf dem MacBook (0.2.0) ergab, dass „Speichern ohne LLM“ im wartenden Aufruf nicht trägt. Umgebaut auf einen losgelösten Wächter. Noch nicht veröffentlicht.

Befund aus dem Test (Iris auf dem MacBook, Test-Memory tmp-memtest)

  • ✔ Hermes setzt memory edit ab, das Canvas erscheint in der App.
  • ✔ Der Klick kommt als <Workspace>/canvas_response.json an, auch wenn der Aufruf längst abgelaufen ist.
  • ✘ Das Modell setzte timeout: 60 (Request-Dump: "timeout":60), obwohl der Skill „timeout 600“ verlangte; Ergebnis [Command timed out after 60s], Exit 124. Der Prozess wurde dabei nicht beendet (Waise).
  • ✘ Der Klick „Speichern“ ohne Bearbeiten lieferte {"submitted_by":"memory_save","values":{}}: Die App schickt ein unbearbeitetes Textfeld nicht mit (CanvasTextInputView setzt fieldValues[id] nur beim Tippen). Das Skript wertete das als Fehler.
  • ✘ Hermes meldete danach „wurde erfolgreich gespeichert“; die Datei war unverändert, es gab kein Backup. Das ist der bekannte Fehler (Erfolg ohne Skript-Beleg), diesmal bei einem Klick, den das Skript nicht mehr verarbeitete.

Geändert

  • memory edit startet einen losgelösten Wächter (start_new_session) und kehrt sofort zurück (Status wartet); es ist kein timeout mehr nötig. Der Wächter wartet 30 Minuten, speichert den Klick selbst und schreibt <Workspace>/memory_ergebnis.json. --vordergrund behält das alte Verhalten.
  • memory ergebnis --workspace … und auswahl bei memory_save/memory_cancel geben das Ergebnis aus (gespeichert, unveraendert, abgebrochen, fehler, offen, wartet). Skill und Systemprompt: nur melden, was status sagt, „gespeichert“ nie ohne status: gespeichert.
  • Fehlendes Textfeld in der Antwort = unveraendert (kein Fehler).
  • Ein neuer edit löst einen noch wartenden Wächter im selben Workspace über eine Kennung ab (sonst hätte dessen späteres „offen“ ein gutes Ergebnis überschrieben; im MacBook-Versuch aufgefallen, mit Test belegt).

Geprüft

  • 81 Tests grün (u. a. Wächter: sofortige Rückkehr, Speichern, Abbrechen, unbearbeitet, Zeitablauf, Fehlerantwort, Ablösung, altes Ergebnis/alte Antwort, auswahl mit und ohne Klick).
  • Auf dem MacBook mit einer Temp-Kopie des Skripts (installierte Kopie unangetastet) gegen tmp-memtest: edit kehrt in 0,17 s zurück; der Wächter überlebt das Ende der SSH-Sitzung; ein simulierter Klick (Antwortdatei) speichert den geänderten Text, das Backup liegt im Papierkorb, der Wächter beendet sich; zwei edit hintereinander ergeben genau einen Wächter. Testdatei und Test-Papierkorb danach auf den Ausgangszustand zurückgesetzt.

Nicht geprüft

  • Der Ablauf mit echtem Klick in der App und echtem Hermes-Turn nach der Umstellung (Wächter überlebt das Turn-Ende von Hermes? Meldet das Modell nur das Ergebnis aus auswahl?).
  • Ob Hermes den losgelösten Prozess beim Beenden des Turns stehen lässt (SSH-Test zeigt: ja, ohne Hermes).

Offen

  • Neue Version (0.2.1) mit Changelog und Veröffentlichung erst auf Alfs „Veröffentliche“; bis dahin bleibt 0.2.0 mit dem alten Verhalten veröffentlicht.
  • WebView-Editor memory_editor (Schritt 4) nach bestandenem Praxistest.
PR #208 gemergt: fix(claude-sessions): memory edit mit losgelöstem Wächter statt wartendem Aufruf (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/208 Commits: - fix(claude-sessions): memory edit mit losgelöstem Wächter statt wartendem Aufruf (#203) --- **Stand: Praxistest auf dem MacBook (0.2.0) ergab, dass „Speichern ohne LLM“ im wartenden Aufruf nicht trägt. Umgebaut auf einen losgelösten Wächter. Noch nicht veröffentlicht.** **Befund aus dem Test (Iris auf dem MacBook, Test-Memory `tmp-memtest`)** - ✔ Hermes setzt `memory edit` ab, das Canvas erscheint in der App. - ✔ Der Klick kommt als `<Workspace>/canvas_response.json` an, auch wenn der Aufruf längst abgelaufen ist. - ✘ Das Modell setzte `timeout: 60` (Request-Dump: `"timeout":60`), obwohl der Skill „timeout 600“ verlangte; Ergebnis `[Command timed out after 60s]`, Exit 124. Der Prozess wurde dabei nicht beendet (Waise). - ✘ Der Klick „Speichern“ ohne Bearbeiten lieferte `{"submitted_by":"memory_save","values":{}}`: Die App schickt ein unbearbeitetes Textfeld nicht mit (`CanvasTextInputView` setzt `fieldValues[id]` nur beim Tippen). Das Skript wertete das als Fehler. - ✘ Hermes meldete danach „wurde erfolgreich gespeichert“; die Datei war unverändert, es gab kein Backup. Das ist der bekannte Fehler (Erfolg ohne Skript-Beleg), diesmal bei einem Klick, den das Skript nicht mehr verarbeitete. **Geändert** - `memory edit` startet einen losgelösten Wächter (`start_new_session`) und kehrt sofort zurück (Status `wartet`); es ist kein `timeout` mehr nötig. Der Wächter wartet 30 Minuten, speichert den Klick selbst und schreibt `<Workspace>/memory_ergebnis.json`. `--vordergrund` behält das alte Verhalten. - `memory ergebnis --workspace …` und `auswahl` bei `memory_save`/`memory_cancel` geben das Ergebnis aus (`gespeichert`, `unveraendert`, `abgebrochen`, `fehler`, `offen`, `wartet`). Skill und Systemprompt: nur melden, was `status` sagt, „gespeichert“ nie ohne `status: gespeichert`. - Fehlendes Textfeld in der Antwort = `unveraendert` (kein Fehler). - Ein neuer `edit` löst einen noch wartenden Wächter im selben Workspace über eine Kennung ab (sonst hätte dessen späteres „offen“ ein gutes Ergebnis überschrieben; im MacBook-Versuch aufgefallen, mit Test belegt). **Geprüft** - 81 Tests grün (u. a. Wächter: sofortige Rückkehr, Speichern, Abbrechen, unbearbeitet, Zeitablauf, Fehlerantwort, Ablösung, altes Ergebnis/alte Antwort, `auswahl` mit und ohne Klick). - Auf dem MacBook mit einer Temp-Kopie des Skripts (installierte Kopie unangetastet) gegen `tmp-memtest`: `edit` kehrt in 0,17 s zurück; der Wächter überlebt das Ende der SSH-Sitzung; ein simulierter Klick (Antwortdatei) speichert den geänderten Text, das Backup liegt im Papierkorb, der Wächter beendet sich; zwei `edit` hintereinander ergeben genau einen Wächter. Testdatei und Test-Papierkorb danach auf den Ausgangszustand zurückgesetzt. **Nicht geprüft** - Der Ablauf mit echtem Klick in der App und echtem Hermes-Turn nach der Umstellung (Wächter überlebt das Turn-Ende von Hermes? Meldet das Modell nur das Ergebnis aus `auswahl`?). - Ob Hermes den losgelösten Prozess beim Beenden des Turns stehen lässt (SSH-Test zeigt: ja, ohne Hermes). **Offen** - Neue Version (0.2.1) mit Changelog und Veröffentlichung erst auf Alfs „Veröffentliche“; bis dahin bleibt 0.2.0 mit dem alten Verhalten veröffentlicht. - WebView-Editor `memory_editor` (Schritt 4) nach bestandenem Praxistest.
Author
Owner

PR #210 gemergt: chore(claude-sessions): Version 0.2.1 — Wächter für Memory-Klicks (#203)
#210

Commits:

  • chore(claude-sessions): Version 0.2.1 — Wächter für Memory-Klicks (#203)

Stand: Version 0.2.1 veröffentlicht (auf Alfs „Veröffentliche“, zum Test auf dem MacBook). Enthält die Umstellung auf den losgelösten Wächter aus PR #208.

Geändert: plugin.json (0.2.1, Änderungstext), store/changelog.md, PLAN.md (Versionsliste, Stand).
Geprüft: 81 Tests grün; publish-plugins.sh --dry-run ohne Fehler (Build, Datenschutz-Scan).
Nicht geprüft: Praxistest von 0.2.1 mit echtem Klick in der App und echtem Hermes-Turn; Update über den Plugin-Manager auf dem MacBook.
Offen: Ergebnis des MacBook-Tests; danach WebView-Editor memory_editor. Issue bleibt offen (status/zu-testen).

PR #210 gemergt: chore(claude-sessions): Version 0.2.1 — Wächter für Memory-Klicks (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/210 Commits: - chore(claude-sessions): Version 0.2.1 — Wächter für Memory-Klicks (#203) --- **Stand: Version 0.2.1 veröffentlicht (auf Alfs „Veröffentliche“, zum Test auf dem MacBook).** Enthält die Umstellung auf den losgelösten Wächter aus PR #208. **Geändert:** `plugin.json` (0.2.1, Änderungstext), `store/changelog.md`, `PLAN.md` (Versionsliste, Stand). **Geprüft:** 81 Tests grün; `publish-plugins.sh --dry-run` ohne Fehler (Build, Datenschutz-Scan). **Nicht geprüft:** Praxistest von 0.2.1 mit echtem Klick in der App und echtem Hermes-Turn; Update über den Plugin-Manager auf dem MacBook. **Offen:** Ergebnis des MacBook-Tests; danach WebView-Editor `memory_editor`. Issue bleibt offen (`status/zu-testen`).
Author
Owner

PR #211 gemergt: fix(claude-sessions): Memory-Sicherungen in eigenen Ordner, Ergebnis mit eindeutigem Hinweis (#203)
#211

Commits:

  • fix(claude-sessions): Memory-Sicherungen in eigenen Ordner, Ergebnis mit eindeutigem Hinweis (#203)

Stand: Praxistest von 0.2.1 auf dem MacBook ausgewertet (Chat-Export …irischat, plus Prüfung per SSH). Das Speichern ohne LLM funktioniert; Korrektur der Formulierung. Noch nicht veröffentlicht.

Befund aus dem Chat

  • ✔ Klick ohne Bearbeiten: Hermes meldete richtig „nicht geändert“ (Skript: unveraendert).
  • ✔ Klick mit Bearbeitung: Der Wächter speicherte (Log: „Memory-Datei test_eintrag.md gespeichert“; memory_ergebnis.json: gespeichert). Auf dem MacBook geprüft: Die Datei liegt an ihrem Platz mit der Änderung (192 Bytes, „Testzeile“), die alte Fassung (181 Bytes) liegt als Kopie im Sicherungsordner, kein Wächter-Prozess übrig.
  • ✘ Hermes deutete das Ergebnis falsch: „Die Datei wurde erfolgreich gespeichert – aber sie wurde versehentlich in den Papierkorb verschoben … Hole ich die Datei zurück?“ Grund: Der Sicherungsordner hieß papierkorb/memory/… und das Ergebnis gesichert_in zeigte darauf. Nichts wurde verschoben. Bei „unverändert“ schrieb das Modell außerdem „papierkorblosen Status“ (sinnlos, aus demselben Wort).

Geändert

  • Sicherungen liegen jetzt in <Daten>/sicherungen/<Projekt>/<Zeit>/ statt papierkorb/memory/… (getrennt vom Papierkorb der Sessions).
  • Ergebnis von memory edit/save trägt einen hinweis: Datei liegt an ihrem Platz, nur eine Kopie der vorherigen Fassung als Sicherung, nichts verschoben, nichts gelöscht.
  • Skill und Systemprompt: gesichert_in ist nur die Sicherung; nie von „verschoben“, „gelöscht“ oder „Papierkorb“ sprechen, nichts zurückholen. Canvas-Text und Anleitung angepasst.

Geprüft: 81 Tests grün (Pfade auf sicherungen, neuer Test auf hinweis). Der Chat-Export und der Zustand auf dem MacBook (lesend) belegen den Befund.

Nicht geprüft: Ob das Modell mit dem neuen Hinweis das Ergebnis richtig wiedergibt (Praxistest nach der Veröffentlichung). Alte Sicherungen unter papierkorb/memory/ (nur auf dem MacBook, Testdaten) werden nicht verschoben.

Offen: Veröffentlichung als 0.2.2 erst auf Alfs „Veröffentliche“; WebView-Editor memory_editor.

PR #211 gemergt: fix(claude-sessions): Memory-Sicherungen in eigenen Ordner, Ergebnis mit eindeutigem Hinweis (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/211 Commits: - fix(claude-sessions): Memory-Sicherungen in eigenen Ordner, Ergebnis mit eindeutigem Hinweis (#203) --- **Stand: Praxistest von 0.2.1 auf dem MacBook ausgewertet (Chat-Export `…irischat`, plus Prüfung per SSH). Das Speichern ohne LLM funktioniert; Korrektur der Formulierung. Noch nicht veröffentlicht.** **Befund aus dem Chat** - ✔ Klick ohne Bearbeiten: Hermes meldete richtig „nicht geändert“ (Skript: `unveraendert`). - ✔ Klick mit Bearbeitung: Der Wächter speicherte (Log: „Memory-Datei test_eintrag.md gespeichert“; `memory_ergebnis.json`: `gespeichert`). Auf dem MacBook geprüft: Die Datei liegt an ihrem Platz mit der Änderung (192 Bytes, „Testzeile“), die alte Fassung (181 Bytes) liegt als Kopie im Sicherungsordner, kein Wächter-Prozess übrig. - ✘ Hermes deutete das Ergebnis falsch: „Die Datei wurde erfolgreich gespeichert – aber sie wurde versehentlich in den **Papierkorb** verschoben … Hole ich die Datei zurück?“ Grund: Der Sicherungsordner hieß `papierkorb/memory/…` und das Ergebnis `gesichert_in` zeigte darauf. Nichts wurde verschoben. Bei „unverändert“ schrieb das Modell außerdem „papierkorblosen Status“ (sinnlos, aus demselben Wort). **Geändert** - Sicherungen liegen jetzt in `<Daten>/sicherungen/<Projekt>/<Zeit>/` statt `papierkorb/memory/…` (getrennt vom Papierkorb der Sessions). - Ergebnis von `memory edit`/`save` trägt einen `hinweis`: Datei liegt an ihrem Platz, nur eine Kopie der vorherigen Fassung als Sicherung, nichts verschoben, nichts gelöscht. - Skill und Systemprompt: `gesichert_in` ist nur die Sicherung; nie von „verschoben“, „gelöscht“ oder „Papierkorb“ sprechen, nichts zurückholen. Canvas-Text und Anleitung angepasst. **Geprüft:** 81 Tests grün (Pfade auf `sicherungen`, neuer Test auf `hinweis`). Der Chat-Export und der Zustand auf dem MacBook (lesend) belegen den Befund. **Nicht geprüft:** Ob das Modell mit dem neuen Hinweis das Ergebnis richtig wiedergibt (Praxistest nach der Veröffentlichung). Alte Sicherungen unter `papierkorb/memory/` (nur auf dem MacBook, Testdaten) werden nicht verschoben. **Offen:** Veröffentlichung als 0.2.2 erst auf Alfs „Veröffentliche“; WebView-Editor `memory_editor`.
Author
Owner

PR #212 gemergt: chore(claude-sessions): Version 0.2.2 — eindeutige Memory-Sicherung (#203)
#212

Commits:

  • chore(claude-sessions): Version 0.2.2 — eindeutige Memory-Sicherung (#203)

Stand: Version 0.2.2 veröffentlicht (auf Alfs „ja bitte“ zur Frage, ob 0.2.2 veröffentlicht werden soll). Enthält die Korrektur aus PR #211 (Sicherungen in sicherungen/, Ergebnis mit eindeutigem Hinweis).

Geändert: plugin.json (0.2.2, Änderungstext), store/changelog.md, PLAN.md (Versionsliste, Stand).
Geprüft: 81 Tests grün; publish-plugins.sh --dry-run ohne Fehler (Build, Datenschutz-Scan).
Nicht geprüft: Ob Hermes mit dem neuen Hinweis das Ergebnis richtig wiedergibt (Praxistest auf dem MacBook nach dem Update); Update über den Plugin-Manager.
Offen: Ergebnis dieses Tests; WebView-Editor memory_editor. Issue bleibt offen (status/zu-testen).

PR #212 gemergt: chore(claude-sessions): Version 0.2.2 — eindeutige Memory-Sicherung (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/212 Commits: - chore(claude-sessions): Version 0.2.2 — eindeutige Memory-Sicherung (#203) --- **Stand: Version 0.2.2 veröffentlicht (auf Alfs „ja bitte“ zur Frage, ob 0.2.2 veröffentlicht werden soll).** Enthält die Korrektur aus PR #211 (Sicherungen in `sicherungen/`, Ergebnis mit eindeutigem Hinweis). **Geändert:** `plugin.json` (0.2.2, Änderungstext), `store/changelog.md`, `PLAN.md` (Versionsliste, Stand). **Geprüft:** 81 Tests grün; `publish-plugins.sh --dry-run` ohne Fehler (Build, Datenschutz-Scan). **Nicht geprüft:** Ob Hermes mit dem neuen Hinweis das Ergebnis richtig wiedergibt (Praxistest auf dem MacBook nach dem Update); Update über den Plugin-Manager. **Offen:** Ergebnis dieses Tests; WebView-Editor `memory_editor`. Issue bleibt offen (`status/zu-testen`).
Author
Owner

PR #213 gemergt: feat(claude-sessions): Memory-Editor als Canvas-Block, Einstieg über das Sessions-Canvas (#203)
#213

Commits:

  • feat(claude-sessions): Memory-Editor als Canvas-Block, Einstieg über das Sessions-Canvas (#203)

Stand: Schritt 5 und 6 gebaut — Memory-Editor als Canvas-Block memory_editor und Einstieg über das Sessions-Canvas. Noch nicht veröffentlicht (Version bleibt 0.2.2).

Was neu ist

  • Block memory_editor (web/index.html + web/memory-logik.js, im Manifest provided_block_types und web_view_path): links Dateiliste (Name, Typ, Marken geändert/neu/entfällt/gelöscht, ⚠ Funde, Haken für den Export, Filter, „nur mit Funden“), rechts Reiter Bearbeiten (Textfeld), Vorschau (kleiner Markdown-Renderer mit Kopfdaten) und Funde. Privat-Check mit „Entfernen“/„Stehen lassen“ je Fund, je Datei und für das ganze Memory (mit Rückfrage). Importieren …: .zip oder .md per Ablegen (irisFileDropped) oder Ordner-Auswahl (irisListDirectory), Mergen oder Ersetzen, Konflikte je Eintrag (behalten / übernehmen / beide), Vorschau im Editor, geschrieben wird erst beim Speichern. Datei löschen, Änderungen verwerfen, Nur-Lesen nach dem Absenden.
  • Ergebnis des Blocks bleibt klein: {import-Plan, edits (nur geänderte Dateien), geloescht, export} über irisSubmitFieldValue; die Texte lädt die Seite selbst per irisFetchFile. Das Skript rechnet den Import beim Ausführen noch einmal selbst (claude_memory.endstand).
  • memory editor PROJEKT --workspace … [--datei NAME]: schreibt das Canvas (Block plus Knöpfe Speichern / Exportieren / Abbrechen) und startet den Wächter wie bei memory edit. Speichern: ganzes Memory neu, Kopie der alten Fassung vorher in sicherungen/. Exportieren: zip der angehakten Dateien in Downloads (IRIS_CLAUDE_EXPORT_DIR für Tests), das Memory bleibt unverändert, verbleibende_funde im Ergebnis. Abbrechen: nichts.
  • Einstieg: Das Sessions-Canvas hat den Knopf „Memory von Claude Code (N Projekte)“ → Projektliste mit „Bearbeiten“ → Editor (auswahl-Zweige memory und memedit:<Projekt>).
  • Skill, Systemprompt, Anleitung, Store-Text und PLAN.md angepasst. memory edit (einzelne Datei als Textfeld) bleibt als Ausweichlösung für eine App ohne Block-Unterstützung.

Geprüft

  • 100 Tests grün. Neu: Editor-Canvas und Wächter-Ergebnisse (Speichern mit Bearbeitung/Löschung/Import Ersetzen und Mergen, Export mit Auswahl und Funde-Zählung, Abbrechen, 10 kaputte Ergebnisse ohne Schreiben, Einstieg, Vorauswahl).
  • Gleiches Rechnen in Python und JavaScript: tests/vektoren.json (aus claude_memory.py erzeugt, 52 Fälle: Frontmatter, Index, Zusammenführen/Ersetzen, Privat-Check) wird von Python und von node geprüft. Der Test fand zwei Abweichungen: Fehlermeldungstext, und \b (Python Unicode, JavaScript ASCII), dafür laufen die Muster jetzt mit re.ASCII.
  • WebKit-Test (tests/webkit_test.swift, echte WKWebView wie in Iris, Brücke nachgebildet, 45 Prüfungen): nimmt das echte Canvas aus memory editor, bedient die Seite (Bearbeiten, Vorschau, Funde einzeln und alle entfernen, Löschen, Export-Auswahl, Import per Ablegen mit Konflikt und Zip-Müll, einzelne .md, falscher Dateityp, Nur-Lesen), schickt den gemeldeten Stand als Klick „Speichern“ an den Wächter und prüft, dass das Memory auf der Platte genau dem Endstand entspricht, den die Seite zeigte. Screenshots angesehen (Layout, Funde, Import-Dialog, Nach-Import-Ansicht).
  • Paket gebaut: web/ und memory-logik.js sind drin.

Nicht geprüft

  • Der Block in der echten Iris-App (Höhe 640 pt, Finder-Drop über irisFileDropped, Zusammenspiel mit den Canvas-Knöpfen, Text im Chat nach dem Klick). Die Brücke im Test ist nachgebaut nach CanvasPluginWebBlockView.swift.
  • Wie sich ein Memory mit mehreren hundert Dateien in der WebView anfühlt (168 Dateien lädt der Code mit 6 parallelen Abrufen; nicht gemessen).
  • Dass das Modell nach „Exportieren“ den Pfad und die Funde richtig wiedergibt.
  • Export und Import aus der WebView ist durch Skript-Wächter und irisFetchFile/Ablegen gelöst (kein Speichern-Dialog nötig). Linux-Server als Gegenstelle bleibt außen vor.

Offen: Veröffentlichung als 0.3.0 erst auf Alfs „Veröffentliche“ (Version, Changelog); danach Praxistest auf dem MacBook.

PR #213 gemergt: feat(claude-sessions): Memory-Editor als Canvas-Block, Einstieg über das Sessions-Canvas (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/213 Commits: - feat(claude-sessions): Memory-Editor als Canvas-Block, Einstieg über das Sessions-Canvas (#203) --- **Stand: Schritt 5 und 6 gebaut — Memory-Editor als Canvas-Block `memory_editor` und Einstieg über das Sessions-Canvas. Noch nicht veröffentlicht (Version bleibt 0.2.2).** **Was neu ist** - **Block `memory_editor`** (`web/index.html` + `web/memory-logik.js`, im Manifest `provided_block_types` und `web_view_path`): links Dateiliste (Name, Typ, Marken geändert/neu/entfällt/gelöscht, ⚠ Funde, Haken für den Export, Filter, „nur mit Funden“), rechts Reiter **Bearbeiten** (Textfeld), **Vorschau** (kleiner Markdown-Renderer mit Kopfdaten) und **Funde**. Privat-Check mit „Entfernen“/„Stehen lassen“ je Fund, je Datei und für das ganze Memory (mit Rückfrage). **Importieren …**: .zip oder .md per Ablegen (`irisFileDropped`) oder Ordner-Auswahl (`irisListDirectory`), Mergen oder Ersetzen, Konflikte je Eintrag (behalten / übernehmen / beide), Vorschau im Editor, geschrieben wird erst beim Speichern. Datei löschen, Änderungen verwerfen, Nur-Lesen nach dem Absenden. - **Ergebnis des Blocks** bleibt klein: `{import-Plan, edits (nur geänderte Dateien), geloescht, export}` über `irisSubmitFieldValue`; die Texte lädt die Seite selbst per `irisFetchFile`. Das Skript rechnet den Import beim Ausführen noch einmal selbst (`claude_memory.endstand`). - **`memory editor PROJEKT --workspace … [--datei NAME]`**: schreibt das Canvas (Block plus Knöpfe Speichern / Exportieren / Abbrechen) und startet den Wächter wie bei `memory edit`. Speichern: ganzes Memory neu, Kopie der alten Fassung vorher in `sicherungen/`. Exportieren: zip der angehakten Dateien in Downloads (`IRIS_CLAUDE_EXPORT_DIR` für Tests), das Memory bleibt unverändert, `verbleibende_funde` im Ergebnis. Abbrechen: nichts. - **Einstieg:** Das Sessions-Canvas hat den Knopf „Memory von Claude Code (N Projekte)“ → Projektliste mit „Bearbeiten“ → Editor (`auswahl`-Zweige `memory` und `memedit:<Projekt>`). - Skill, Systemprompt, Anleitung, Store-Text und PLAN.md angepasst. `memory edit` (einzelne Datei als Textfeld) bleibt als Ausweichlösung für eine App ohne Block-Unterstützung. **Geprüft** - 100 Tests grün. Neu: Editor-Canvas und Wächter-Ergebnisse (Speichern mit Bearbeitung/Löschung/Import Ersetzen und Mergen, Export mit Auswahl und Funde-Zählung, Abbrechen, 10 kaputte Ergebnisse ohne Schreiben, Einstieg, Vorauswahl). - **Gleiches Rechnen in Python und JavaScript:** `tests/vektoren.json` (aus `claude_memory.py` erzeugt, 52 Fälle: Frontmatter, Index, Zusammenführen/Ersetzen, Privat-Check) wird von Python und von `node` geprüft. Der Test fand zwei Abweichungen: Fehlermeldungstext, und `\b` (Python Unicode, JavaScript ASCII), dafür laufen die Muster jetzt mit `re.ASCII`. - **WebKit-Test** (`tests/webkit_test.swift`, echte WKWebView wie in Iris, Brücke nachgebildet, 45 Prüfungen): nimmt das echte Canvas aus `memory editor`, bedient die Seite (Bearbeiten, Vorschau, Funde einzeln und alle entfernen, Löschen, Export-Auswahl, Import per Ablegen mit Konflikt und Zip-Müll, einzelne .md, falscher Dateityp, Nur-Lesen), schickt den gemeldeten Stand als Klick „Speichern“ an den Wächter und prüft, dass das Memory auf der Platte **genau** dem Endstand entspricht, den die Seite zeigte. Screenshots angesehen (Layout, Funde, Import-Dialog, Nach-Import-Ansicht). - Paket gebaut: `web/` und `memory-logik.js` sind drin. **Nicht geprüft** - Der Block in der echten Iris-App (Höhe 640 pt, Finder-Drop über `irisFileDropped`, Zusammenspiel mit den Canvas-Knöpfen, Text im Chat nach dem Klick). Die Brücke im Test ist nachgebaut nach `CanvasPluginWebBlockView.swift`. - Wie sich ein Memory mit mehreren hundert Dateien in der WebView anfühlt (168 Dateien lädt der Code mit 6 parallelen Abrufen; nicht gemessen). - Dass das Modell nach „Exportieren“ den Pfad und die Funde richtig wiedergibt. - Export und Import aus der WebView ist durch Skript-Wächter und `irisFetchFile`/Ablegen gelöst (kein Speichern-Dialog nötig). Linux-Server als Gegenstelle bleibt außen vor. **Offen:** Veröffentlichung als 0.3.0 erst auf Alfs „Veröffentliche“ (Version, Changelog); danach Praxistest auf dem MacBook.
Author
Owner

Korrektur zum Stand-Kommentar von PR #213: tests/vektoren.json enthält 56 Fälle (nicht 52), der WebKit-Test 44 benannte Prüfungen (nicht 45). Der Rest des Kommentars gilt unverändert.

**Korrektur zum Stand-Kommentar von PR #213:** `tests/vektoren.json` enthält 56 Fälle (nicht 52), der WebKit-Test 44 benannte Prüfungen (nicht 45). Der Rest des Kommentars gilt unverändert.
Author
Owner

PR #214 gemergt: chore(claude-sessions): Version 0.3.0 — Memory-Editor (#203)
#214

Commits:

  • chore(claude-sessions): Version 0.3.0 — Memory-Editor (#203)

Stand: Version 0.3.0 veröffentlicht (auf Alfs „veröffentliche“, zum Test auf dem MacBook). Enthält den Memory-Editor aus PR #213.

Geändert: plugin.json (0.3.0, Änderungstext), store/changelog.md, PLAN.md (Stand).
Geprüft: 100 Tests grün; publish-plugins.sh --dry-run ohne Fehler (Build mit web/, Datenschutz-Scan über Manifest, Store-Texte, Anleitung und Paket).
Nicht geprüft: Der Editor-Block in der echten Iris-App (Höhe, Drop aus dem Finder, Canvas-Knöpfe, Text im Chat nach dem Klick); großes Memory; Update über den Plugin-Manager. Ob das Plugin mit provided_block_types/web_view_path auf dem Mac sauber installiert wird, zeigt erst das Update.
Offen: Praxistest auf dem MacBook; danach ggf. Korrekturen. Issue bleibt offen (status/zu-testen).

PR #214 gemergt: chore(claude-sessions): Version 0.3.0 — Memory-Editor (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/214 Commits: - chore(claude-sessions): Version 0.3.0 — Memory-Editor (#203) --- **Stand: Version 0.3.0 veröffentlicht (auf Alfs „veröffentliche“, zum Test auf dem MacBook).** Enthält den Memory-Editor aus PR #213. **Geändert:** `plugin.json` (0.3.0, Änderungstext), `store/changelog.md`, `PLAN.md` (Stand). **Geprüft:** 100 Tests grün; `publish-plugins.sh --dry-run` ohne Fehler (Build mit `web/`, Datenschutz-Scan über Manifest, Store-Texte, Anleitung und Paket). **Nicht geprüft:** Der Editor-Block in der echten Iris-App (Höhe, Drop aus dem Finder, Canvas-Knöpfe, Text im Chat nach dem Klick); großes Memory; Update über den Plugin-Manager. Ob das Plugin mit `provided_block_types`/`web_view_path` auf dem Mac sauber installiert wird, zeigt erst das Update. **Offen:** Praxistest auf dem MacBook; danach ggf. Korrekturen. Issue bleibt offen (`status/zu-testen`).
Author
Owner

PR #215 gemergt: fix(claude-sessions): Knopf-Kennungen ohne „memory“, Modell hielt sie für den Hermes-Skill (#203)
#215

Commits:

  • fix(claude-sessions): Knopf-Kennungen ohne „memory“, Modell hielt sie für den Hermes-Skill (#203)

Stand: Praxistest von 0.3.0 auf dem Mac (lokale Iris, Chat „Zeig mir die Claude Code Sessions“) — erster Klick auf „Memory von Claude Code“ schlug fehl. Ursache gefunden und behoben, noch nicht veröffentlicht.

Befund (Job-Daten, Hermes-Log und Request-Dump gelesen)

  • Das Sessions-Canvas war korrekt: 23 Blöcke, am Ende die Karte „Neue Session“ und der Knopf mit der ID memory.
  • Auf den Klick kam „Canvas-Auswahl bestätigt: Schaltfläche: memory“. Das Modell ließ auswahl aus und antwortete „Hier die letzten 5 Iris-Chats“ mit memory-pills, mit der Begründung „Ich hole die Iris-Chips aus der Memory-Datenbank“: Es hat die Kennung memory für den Hermes-Skill memory (Iris-Gesprächshistorie durchsuchen) gehalten.
  • Auf dem MacBook (anderer Lauf) hatte derselbe Weg mit memory_save funktioniert; die Kennung memory ist der härteste Fall, die anderen tragen dasselbe Wort.

Geändert

  • Alle Kennungen ohne das Wort memory: cc_liste (statt memory), ccedit:<Projekt> (statt memedit:), cc_save/cc_export/cc_cancel (statt memory_save/memory_export/memory_cancel), Textfeld cc_text, Block-ID cc_editor (Ergebnisfeld cc_editor.result; der Blocktyp heißt weiter memory_editor).
  • Systemprompt und SKILL.md nennen die Kennungen ausdrücklich und verbieten, dafür den Skill memory oder einen anderen Skill zu laden; das „Memory“ hier ist das von Claude Code.

Geprüft: 100 Tests grün (Kennungen in Skript, Tests und WebKit-Test angepasst).
Nicht geprüft: Ob das lokale Modell mit den neuen Kennungen und dem Prompt auswahl aufruft (Praxistest nach der Veröffentlichung).

Beobachtet, nicht behoben: In der Session-Liste erscheinen Sessions als „(OHNE TITEL)“ oder mit dem Titel „Iris Canvas-System Du kannst strukturierte UI-Blöcke …“: Das sind Claude-Code-Sessions, die Iris selbst gestartet hat; ihre erste Nachricht ist der vorangestellte Canvas-Systemprompt. Eigenes Thema (Titel aus der ersten echten Nutzernachricht).

Offen: Veröffentlichung als 0.3.1 auf Alfs „Veröffentliche“.

PR #215 gemergt: fix(claude-sessions): Knopf-Kennungen ohne „memory“, Modell hielt sie für den Hermes-Skill (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/215 Commits: - fix(claude-sessions): Knopf-Kennungen ohne „memory“, Modell hielt sie für den Hermes-Skill (#203) --- **Stand: Praxistest von 0.3.0 auf dem Mac (lokale Iris, Chat „Zeig mir die Claude Code Sessions“) — erster Klick auf „Memory von Claude Code“ schlug fehl. Ursache gefunden und behoben, noch nicht veröffentlicht.** **Befund (Job-Daten, Hermes-Log und Request-Dump gelesen)** - Das Sessions-Canvas war korrekt: 23 Blöcke, am Ende die Karte „Neue Session“ und der Knopf mit der ID `memory`. - Auf den Klick kam „Canvas-Auswahl bestätigt: Schaltfläche: memory“. Das Modell ließ `auswahl` aus und antwortete „Hier die letzten 5 Iris-Chats“ mit `memory-pills`, mit der Begründung „Ich hole die Iris-Chips aus der Memory-Datenbank“: Es hat die Kennung `memory` für den **Hermes-Skill `memory`** (Iris-Gesprächshistorie durchsuchen) gehalten. - Auf dem MacBook (anderer Lauf) hatte derselbe Weg mit `memory_save` funktioniert; die Kennung `memory` ist der härteste Fall, die anderen tragen dasselbe Wort. **Geändert** - Alle Kennungen ohne das Wort `memory`: `cc_liste` (statt `memory`), `ccedit:<Projekt>` (statt `memedit:`), `cc_save`/`cc_export`/`cc_cancel` (statt `memory_save`/`memory_export`/`memory_cancel`), Textfeld `cc_text`, Block-ID `cc_editor` (Ergebnisfeld `cc_editor.result`; der Blocktyp heißt weiter `memory_editor`). - Systemprompt und SKILL.md nennen die Kennungen ausdrücklich und verbieten, dafür den Skill `memory` oder einen anderen Skill zu laden; das „Memory“ hier ist das von Claude Code. **Geprüft:** 100 Tests grün (Kennungen in Skript, Tests und WebKit-Test angepasst). **Nicht geprüft:** Ob das lokale Modell mit den neuen Kennungen und dem Prompt `auswahl` aufruft (Praxistest nach der Veröffentlichung). **Beobachtet, nicht behoben:** In der Session-Liste erscheinen Sessions als „(OHNE TITEL)“ oder mit dem Titel „Iris Canvas-System Du kannst strukturierte UI-Blöcke …“: Das sind Claude-Code-Sessions, die Iris selbst gestartet hat; ihre erste Nachricht ist der vorangestellte Canvas-Systemprompt. Eigenes Thema (Titel aus der ersten echten Nutzernachricht). **Offen:** Veröffentlichung als 0.3.1 auf Alfs „Veröffentliche“.
Author
Owner

PR #216 gemergt: chore(claude-sessions): Version 0.3.1 — Knopf-Kennungen (#203)
#216

Commits:

  • chore(claude-sessions): Version 0.3.1 — Knopf-Kennungen (#203)

Stand: Version 0.3.1 veröffentlicht (auf Alfs „veröffentliche“, zum Test auf der lokalen Iris). Enthält die Korrektur der Knopf-Kennungen aus PR #215.

Geändert: plugin.json (0.3.1, Änderungstext), store/changelog.md, PLAN.md (Versionsliste, Stand, Lessons Learned zu Kennungen, die wie ein Skill heißen).
Geprüft: 100 Tests grün; publish-plugins.sh --dry-run ohne Fehler (Build, Datenschutz-Scan).
Nicht geprüft: Ob das lokale Modell mit den neuen Kennungen auswahl aufruft und der Editor in der App erscheint (Praxistest).
Offen: Ergebnis dieses Tests; Titel der von Iris gestarteten Sessions in der Liste (eigenes Thema). Issue bleibt offen (status/zu-testen).

PR #216 gemergt: chore(claude-sessions): Version 0.3.1 — Knopf-Kennungen (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/216 Commits: - chore(claude-sessions): Version 0.3.1 — Knopf-Kennungen (#203) --- **Stand: Version 0.3.1 veröffentlicht (auf Alfs „veröffentliche“, zum Test auf der lokalen Iris).** Enthält die Korrektur der Knopf-Kennungen aus PR #215. **Geändert:** `plugin.json` (0.3.1, Änderungstext), `store/changelog.md`, `PLAN.md` (Versionsliste, Stand, Lessons Learned zu Kennungen, die wie ein Skill heißen). **Geprüft:** 100 Tests grün; `publish-plugins.sh --dry-run` ohne Fehler (Build, Datenschutz-Scan). **Nicht geprüft:** Ob das lokale Modell mit den neuen Kennungen `auswahl` aufruft und der Editor in der App erscheint (Praxistest). **Offen:** Ergebnis dieses Tests; Titel der von Iris gestarteten Sessions in der Liste (eigenes Thema). Issue bleibt offen (`status/zu-testen`).
Author
Owner

PR #217 gemergt: feat(claude-sessions): Sitzungs-Wächter setzt alle Klicks des Sessions-Canvas ohne Modell um (#203)
#217

Commits:

  • feat(claude-sessions): Sitzungs-Wächter setzt alle Klicks des Sessions-Canvas ohne Modell um (#203)

Stand: Praxistest von 0.3.1 auf der lokalen Iris — der Klick auf „Memory von Claude Code“ führte wieder zu nichts. Ursache: ein kleines lokales Modell. Gebaut: Sitzungs-Wächter, der alle Klicks selbst umsetzt. Noch nicht veröffentlicht.

Befund (Job-Daten und Hermes-Log gelesen)

  • Plugin 0.3.1 war installiert, das Canvas korrekt (23 Blöcke, Knopf cc_liste). Nach dem Klick kam „Canvas-Auswahl bestätigt: Schaltfläche: cc_liste“ an; der Turn bestand aus einem Modellaufruf ohne Werkzeug (api_calls=1, tool_turns=0) und der Antwort „Der Klick hat keine weiteren Feldeingaben mitgebracht — die Liste war reine Anzeige, es ist also nichts zu tun.“
  • Das Modell war swift-1.5-iq3_xxs (klein, stark quantisiert). Auch im ersten Turn improvisierte es (skill_view, terminal, write_file mit einem selbstgebauten Canvas, dann das richtige). Der Prompt war da und eindeutig; ein solches Modell befolgt ihn nicht verlässlich.
  • Ein Klick darf deshalb nicht davon abhängen, dass das Modell etwas ausführt.

Geändert

  • canvas startet einen losgelösten Sitzungs-Wächter (Kennung/PID in memory_waechter.json, art: sitzung), der auf canvas_response.json wartet und jeden Klick umsetzt: Fortsetzen/Neue Session (Terminal), Umbenennen (Formular und Speichern), Papierkorb und Zurückholen, Zurück zur Liste, Memory-Projekte, Editor öffnen und darin Speichern/Exportieren/Abbrechen (Ergebnis-Canvas mit „Zurück zur Liste“ und „Memory-Projekte“). Nach jedem Klick schreibt er das nächste Canvas (atomar), bei Fehlern ein Fehler-Canvas; ein Klick beendet den Wächter nie. Wartezeit 30 Minuten ab dem letzten Klick; ein neues canvas/memory editor im selben Workspace löst ihn ab.
  • auswahl meldet nur noch das Ergebnis des Wächters (status: vom_waechter_erledigt mit meldung/ergebnis, oder wartet); ohne laufenden Wächter führt es den Klick wie bisher selbst aus. Protokoll in sitzung_log.json.
  • Die Funktion hinter auswahl ist als auswahl_ausfuehren herausgelöst und wird vom Wächter wiederverwendet. canvas_datei schreibt atomar.
  • Systemprompt und SKILL.md: Der Wächter hat den Klick schon umgesetzt; das Modell ruft höchstens auswahl auf, berichtet nur dessen Ausgabe und führt nichts selbst aus.

Geprüft

  • 112 Tests grün; neu tests/test_sitzung.py (12 Tests, die App wird gespielt): Start und Ablösung, alte Antwort zählt nicht, Umbenennen/Papierkorb/Zurückholen/Zurück, Fehler und unbekannte Knöpfe beenden den Wächter nicht, Memory-Liste → Editor → Speichern (Datei, Sicherung, Ergebnis-Canvas, zurück zur Liste), Export, Abbrechen, kaputtes Editor-Ergebnis, auswahl mit Wächter und ohne, Wartezeit läuft ab.
  • Im App-Code gelesen: Der Datei-Wächter der App (AgentJob.swift) prüft während jedes Modell-Laufs alle 0,5 s auf canvas_request.json und noch einmal beim Ende; ein Klick startet immer einen Lauf, daher wird ein Canvas des Wächters angezeigt, solange der Lauf länger als etwa eine halbe Sekunde dauert.

Nicht geprüft

  • Der Ablauf in der echten App mit diesem Wächter (Canvas erscheint nach dem Klick wie erwartet; das Modell schreibt dazu einen Satz, der stören könnte).
  • Sehr schnelle Läufe (< 0,5 s): Ein Canvas käme dann erst beim nächsten Lauf. Nicht beobachtet.

Beobachtet, nicht behoben: Sessions mit dem Titel „Iris Canvas-System …“ oder „(ohne Titel)“ in der Liste (von Iris gestartete Claude-Code-Sessions); der erste Turn eines kleinen Modells baut manchmal ein eigenes Canvas, bevor das richtige kommt.

Offen: Veröffentlichung als 0.3.2 auf Alfs „Veröffentliche“; Praxistest auf der lokalen Iris.

PR #217 gemergt: feat(claude-sessions): Sitzungs-Wächter setzt alle Klicks des Sessions-Canvas ohne Modell um (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/217 Commits: - feat(claude-sessions): Sitzungs-Wächter setzt alle Klicks des Sessions-Canvas ohne Modell um (#203) --- **Stand: Praxistest von 0.3.1 auf der lokalen Iris — der Klick auf „Memory von Claude Code“ führte wieder zu nichts. Ursache: ein kleines lokales Modell. Gebaut: Sitzungs-Wächter, der alle Klicks selbst umsetzt. Noch nicht veröffentlicht.** **Befund (Job-Daten und Hermes-Log gelesen)** - Plugin 0.3.1 war installiert, das Canvas korrekt (23 Blöcke, Knopf `cc_liste`). Nach dem Klick kam „Canvas-Auswahl bestätigt: Schaltfläche: cc_liste“ an; der Turn bestand aus **einem** Modellaufruf ohne Werkzeug (`api_calls=1, tool_turns=0`) und der Antwort „Der Klick hat keine weiteren Feldeingaben mitgebracht — die Liste war reine Anzeige, es ist also nichts zu tun.“ - Das Modell war `swift-1.5-iq3_xxs` (klein, stark quantisiert). Auch im ersten Turn improvisierte es (`skill_view`, `terminal`, `write_file` mit einem selbstgebauten Canvas, dann das richtige). Der Prompt war da und eindeutig; ein solches Modell befolgt ihn nicht verlässlich. - Ein Klick darf deshalb nicht davon abhängen, dass das Modell etwas ausführt. **Geändert** - **`canvas` startet einen losgelösten Sitzungs-Wächter** (Kennung/PID in `memory_waechter.json`, `art: sitzung`), der auf `canvas_response.json` wartet und **jeden** Klick umsetzt: Fortsetzen/Neue Session (Terminal), Umbenennen (Formular und Speichern), Papierkorb und Zurückholen, Zurück zur Liste, Memory-Projekte, Editor öffnen und darin Speichern/Exportieren/Abbrechen (Ergebnis-Canvas mit „Zurück zur Liste“ und „Memory-Projekte“). Nach jedem Klick schreibt er das nächste Canvas (atomar), bei Fehlern ein Fehler-Canvas; ein Klick beendet den Wächter nie. Wartezeit 30 Minuten ab dem letzten Klick; ein neues `canvas`/`memory editor` im selben Workspace löst ihn ab. - **`auswahl` meldet nur noch das Ergebnis des Wächters** (`status: vom_waechter_erledigt` mit `meldung`/`ergebnis`, oder `wartet`); ohne laufenden Wächter führt es den Klick wie bisher selbst aus. Protokoll in `sitzung_log.json`. - Die Funktion hinter `auswahl` ist als `auswahl_ausfuehren` herausgelöst und wird vom Wächter wiederverwendet. `canvas_datei` schreibt atomar. - Systemprompt und SKILL.md: Der Wächter hat den Klick schon umgesetzt; das Modell ruft höchstens `auswahl` auf, berichtet nur dessen Ausgabe und führt nichts selbst aus. **Geprüft** - 112 Tests grün; neu `tests/test_sitzung.py` (12 Tests, die App wird gespielt): Start und Ablösung, alte Antwort zählt nicht, Umbenennen/Papierkorb/Zurückholen/Zurück, Fehler und unbekannte Knöpfe beenden den Wächter nicht, Memory-Liste → Editor → Speichern (Datei, Sicherung, Ergebnis-Canvas, zurück zur Liste), Export, Abbrechen, kaputtes Editor-Ergebnis, `auswahl` mit Wächter und ohne, Wartezeit läuft ab. - Im App-Code gelesen: Der Datei-Wächter der App (`AgentJob.swift`) prüft während jedes Modell-Laufs alle 0,5 s auf `canvas_request.json` und noch einmal beim Ende; ein Klick startet immer einen Lauf, daher wird ein Canvas des Wächters angezeigt, solange der Lauf länger als etwa eine halbe Sekunde dauert. **Nicht geprüft** - Der Ablauf in der echten App mit diesem Wächter (Canvas erscheint nach dem Klick wie erwartet; das Modell schreibt dazu einen Satz, der stören könnte). - Sehr schnelle Läufe (< 0,5 s): Ein Canvas käme dann erst beim nächsten Lauf. Nicht beobachtet. **Beobachtet, nicht behoben:** Sessions mit dem Titel „Iris Canvas-System …“ oder „(ohne Titel)“ in der Liste (von Iris gestartete Claude-Code-Sessions); der erste Turn eines kleinen Modells baut manchmal ein eigenes Canvas, bevor das richtige kommt. **Offen:** Veröffentlichung als 0.3.2 auf Alfs „Veröffentliche“; Praxistest auf der lokalen Iris.
Author
Owner

PR #219 gemergt: chore(claude-sessions): Version 0.3.2 — Sitzungs-Wächter (#203)
#219

Commits:

  • chore(claude-sessions): Version 0.3.2 — Sitzungs-Wächter (#203)

Stand: Version 0.3.2 veröffentlicht (auf Alfs „Veröffentliche“, zum Test auf der lokalen Iris). Enthält den Sitzungs-Wächter aus PR #217.

Geändert: plugin.json (0.3.2, Änderungstext), store/changelog.md, PLAN.md (Stand).
Geprüft: 112 Tests grün; publish-plugins.sh --dry-run ohne Fehler (Build, Datenschutz-Scan).
Nicht geprüft: Der Ablauf mit echten Klicks in der App (Canvas erscheint nach dem Klick, Satz des Modells dazu); sehr schnelle Modell-Läufe; Update über den Plugin-Manager.
Offen: Ergebnis des Praxistests; Titel der von Iris gestarteten Sessions in der Liste (eigenes Thema). Issue bleibt offen (status/zu-testen).

PR #219 gemergt: chore(claude-sessions): Version 0.3.2 — Sitzungs-Wächter (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/219 Commits: - chore(claude-sessions): Version 0.3.2 — Sitzungs-Wächter (#203) --- **Stand: Version 0.3.2 veröffentlicht (auf Alfs „Veröffentliche“, zum Test auf der lokalen Iris).** Enthält den Sitzungs-Wächter aus PR #217. **Geändert:** `plugin.json` (0.3.2, Änderungstext), `store/changelog.md`, `PLAN.md` (Stand). **Geprüft:** 112 Tests grün; `publish-plugins.sh --dry-run` ohne Fehler (Build, Datenschutz-Scan). **Nicht geprüft:** Der Ablauf mit echten Klicks in der App (Canvas erscheint nach dem Klick, Satz des Modells dazu); sehr schnelle Modell-Läufe; Update über den Plugin-Manager. **Offen:** Ergebnis des Praxistests; Titel der von Iris gestarteten Sessions in der Liste (eigenes Thema). Issue bleibt offen (`status/zu-testen`).
Author
Owner

PR #221 gemergt: fix(claude-sessions): Wächter zustandslos, canvas direkt nach einem Klick nicht neu zeichnen (#203)
#221

Commits:

  • fix(claude-sessions): Wächter zustandslos, canvas direkt nach einem Klick nicht neu zeichnen (#203)

Stand: Chat-Export vom ersten Test mit 0.3.2 ausgewertet — der Sitzungs-Wächter funktioniert; aufgefallen ist, dass das Modell danach selbst canvas aufruft und den Wächter ersetzt. Behoben, noch nicht veröffentlicht.

Befund (Chat-Export, sitzung_log.json, Workspace)

  • ✔ Das Modell rief canvas auf und sagte „Der Wächter erledigt das direkt.“
  • ✔ Klick cc_liste: Der Wächter schrieb das Canvas „Memory von Claude Code“ (Log: „Memory-Projekte als Canvas geschrieben.“). Klick ccedit:…: Der Wächter schrieb das Editor-Canvas (Block memory_editor, 2 Blöcke).
  • ✘ Danach stand unter dem noch offenen Editor ein zweites Sessions-Canvas: Das Modell hatte nach dem Klick selbst canvas aufgerufen (Wächter-Datei später als der letzte Log-Eintrag). Das ersetzte den Wächter, der sich den Editor-Kontext gemerkt hatte; Speichern im Editor wäre beim neuen Wächter ins Leere gegangen.

Geändert

  • Wächter zustandslos: Die Knöpfe im Editor-Canvas heißen cc_save:<Projekt>, cc_export:<Projekt>, cc_cancel:<Projekt>; ein Klick enthält alles, was der Wächter braucht. Jeder Wächter kann jedes offene Editor-Canvas bedienen (auch nach einem Ersetzen).
  • Einfaches canvas direkt nach einem umgesetzten Klick (unter 60 s) zeichnet nichts neu und meldet uebersprungen: true mit dem Hinweis, nichts weiter zu tun; --papierkorb, --suche und --neu zeichnen immer. Prompt und Skill sagen es.

Geprüft: 115 Tests grün (neu: Editor nach Ersetzen des Wächters bedienbar, Überspringen direkt nach dem Klick und seine Ausnahmen, Neuzeichnen nach einer Pause).
Nicht geprüft: Ob der Editor-Block selbst in der App richtig erscheint und bedienbar ist (der Export enthält nur das Canvas, keine Bildschirmaufnahme); Speichern/Exportieren im Editor mit echtem Klick.
Offen: Veröffentlichung als 0.3.3 auf Alfs „Veröffentliche“; der Editor-Praxistest in der App.

PR #221 gemergt: fix(claude-sessions): Wächter zustandslos, canvas direkt nach einem Klick nicht neu zeichnen (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/221 Commits: - fix(claude-sessions): Wächter zustandslos, canvas direkt nach einem Klick nicht neu zeichnen (#203) --- **Stand: Chat-Export vom ersten Test mit 0.3.2 ausgewertet — der Sitzungs-Wächter funktioniert; aufgefallen ist, dass das Modell danach selbst `canvas` aufruft und den Wächter ersetzt. Behoben, noch nicht veröffentlicht.** **Befund (Chat-Export, `sitzung_log.json`, Workspace)** - ✔ Das Modell rief `canvas` auf und sagte „Der Wächter erledigt das direkt.“ - ✔ Klick `cc_liste`: Der Wächter schrieb das Canvas „Memory von Claude Code“ (Log: „Memory-Projekte als Canvas geschrieben.“). Klick `ccedit:…`: Der Wächter schrieb das Editor-Canvas (Block `memory_editor`, 2 Blöcke). - ✘ Danach stand unter dem noch offenen Editor ein **zweites Sessions-Canvas**: Das Modell hatte nach dem Klick selbst `canvas` aufgerufen (Wächter-Datei später als der letzte Log-Eintrag). Das ersetzte den Wächter, der sich den Editor-Kontext gemerkt hatte; Speichern im Editor wäre beim neuen Wächter ins Leere gegangen. **Geändert** - **Wächter zustandslos:** Die Knöpfe im Editor-Canvas heißen `cc_save:<Projekt>`, `cc_export:<Projekt>`, `cc_cancel:<Projekt>`; ein Klick enthält alles, was der Wächter braucht. Jeder Wächter kann jedes offene Editor-Canvas bedienen (auch nach einem Ersetzen). - **Einfaches `canvas` direkt nach einem umgesetzten Klick (unter 60 s) zeichnet nichts neu** und meldet `uebersprungen: true` mit dem Hinweis, nichts weiter zu tun; `--papierkorb`, `--suche` und `--neu` zeichnen immer. Prompt und Skill sagen es. **Geprüft:** 115 Tests grün (neu: Editor nach Ersetzen des Wächters bedienbar, Überspringen direkt nach dem Klick und seine Ausnahmen, Neuzeichnen nach einer Pause). **Nicht geprüft:** Ob der Editor-Block selbst in der App richtig erscheint und bedienbar ist (der Export enthält nur das Canvas, keine Bildschirmaufnahme); Speichern/Exportieren im Editor mit echtem Klick. **Offen:** Veröffentlichung als 0.3.3 auf Alfs „Veröffentliche“; der Editor-Praxistest in der App.
Author
Owner

PR #222 gemergt: chore(claude-sessions): Version 0.3.3 — Wächter zustandslos (#203)
#222

Commits:

  • chore(claude-sessions): Version 0.3.3 — Wächter zustandslos (#203)

Stand: Version 0.3.3 veröffentlicht (auf Alfs „Veröffentliche das Plugin“). Enthält die Korrektur aus PR #221 (Wächter zustandslos, canvas direkt nach einem Klick nicht neu zeichnen).

Geändert: plugin.json (0.3.3, Änderungstext), store/changelog.md, PLAN.md (Versionsliste, Stand).
Geprüft: 115 Tests grün; publish-plugins.sh --dry-run ohne Fehler (Build, Datenschutz-Scan).
Nicht geprüft: Der Editor-Block in der echten App (Darstellung, Bedienung), Speichern/Exportieren mit echtem Klick; Update über den Plugin-Manager.
Offen: Praxistest des Editors in der App; Titel der von Iris gestarteten Sessions in der Liste (eigenes Thema). Issue bleibt offen (status/zu-testen).

PR #222 gemergt: chore(claude-sessions): Version 0.3.3 — Wächter zustandslos (#203) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/222 Commits: - chore(claude-sessions): Version 0.3.3 — Wächter zustandslos (#203) --- **Stand: Version 0.3.3 veröffentlicht (auf Alfs „Veröffentliche das Plugin“).** Enthält die Korrektur aus PR #221 (Wächter zustandslos, `canvas` direkt nach einem Klick nicht neu zeichnen). **Geändert:** `plugin.json` (0.3.3, Änderungstext), `store/changelog.md`, `PLAN.md` (Versionsliste, Stand). **Geprüft:** 115 Tests grün; `publish-plugins.sh --dry-run` ohne Fehler (Build, Datenschutz-Scan). **Nicht geprüft:** Der Editor-Block in der echten App (Darstellung, Bedienung), Speichern/Exportieren mit echtem Klick; Update über den Plugin-Manager. **Offen:** Praxistest des Editors in der App; Titel der von Iris gestarteten Sessions in der Liste (eigenes Thema). Issue bleibt offen (`status/zu-testen`).
Author
Owner

Folge-Entscheidung (2026-10-22): Der Wächter ist die Übergangslösung für das, was ein autonomer Web-Block künftig selbst kann (eigene Aktionen als Skript, eigener Zustand, Start ohne Modell). Spezifikation: iris/Iris#149; Plugin-Seite: iris-plugins#225 (dort auch die Migration des Memory-Editors). Bis das Feature in einem stabilen Release steckt, bleibt der Wächter.

**Folge-Entscheidung (2026-10-22):** Der Wächter ist die Übergangslösung für das, was ein autonomer Web-Block künftig selbst kann (eigene Aktionen als Skript, eigener Zustand, Start ohne Modell). Spezifikation: **iris/Iris#149**; Plugin-Seite: **iris-plugins#225** (dort auch die Migration des Memory-Editors). Bis das Feature in einem stabilen Release steckt, bleibt der Wächter.
alf closed this issue 2026-10-27 10:42:07 +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#203
No description provided.