Mac-Server: Endpunkt "Claude Code im Terminal öffnen" (für Plugin iris-claude-sessions) #132

Closed
opened 2026-10-21 14:14:37 +00:00 by alf · 4 comments
Owner

Zweck

Das geplante Plugin iris-claude-sessions (iris/iris-plugins#167) zeigt Claude-Code-Sessions als Canvas. Ein Klick (kommt als Chatnachricht beim Agenten an, der dann das Plugin-Skript ruft) soll ein Terminal mit Claude Code im Agent-LLM der App öffnen und eine Session fortsetzen oder neu starten.

Befund

Die Logik "Claude Code mit aktuellem Agent-LLM starten" steckt in der App: CompanionManager.openAgentInTerminalWithCurrentAgentLLM(agentType:workingDirectoryOverride:) (Session-Proxy, Backend-Variablen, Modell, CLAUDE_CODE_DISABLE_AGENT_VIEW=1 seit #130). Ein Plugin-Skript hat keinen Zugang dazu und darf sie nicht nachbauen (doppelte Backend-Logik).

Umfang

Neuer Endpunkt im Mac-Server (IrisRemoteServer.swift): Claude Code im Terminal öffnen, mit

  • cwd (Pflicht, sonst Setting claudeCodeProjectDirectory),
  • session_id (optional: --resume <id>; ohne = neue Session),
  • name (optional: --name, damit /resume den Namen zeigt).
    Ruft dieselbe Funktion wie die Header-Buttons; buildClaudeCodeTerminalScript bekommt dafür optionale Parameter für --resume und --name. Nur Mac, nur Claude Code.

Zu klären

  • Auth für Plugin-Skripte (entschieden, PR #133): Loopback ohne Bearer, wie /notify und /agent; kein Keychain-Zugriff.
  • Version: Plugin braucht dann iris_min_version der App-Version mit dem Endpunkt.
  • Läuft die Session schon (siehe ~/.claude/sessions/<pid>.json), lehnt der Endpunkt ab oder meldet es; das prüft das Plugin vorher, der Endpunkt sollte es nicht still zulassen (eine Session = ein Prozess).
  • Wire-Protokoll: nur Mac-Server-intern, kein Client betroffen; Linux-Server bekommt den Endpunkt nicht.

Tests

Von Hand: Klick-Start öffnet Terminal.app mit richtigem Backend, Verzeichnis und --resume. Unit-Test für die Skript-Zeile (--resume, --name, Quoting von Pfad und Name).

## Zweck Das geplante Plugin `iris-claude-sessions` (iris/iris-plugins#167) zeigt Claude-Code-Sessions als Canvas. Ein Klick (kommt als Chatnachricht beim Agenten an, der dann das Plugin-Skript ruft) soll ein Terminal mit Claude Code im Agent-LLM der App öffnen und eine Session fortsetzen oder neu starten. ## Befund Die Logik "Claude Code mit aktuellem Agent-LLM starten" steckt in der App: `CompanionManager.openAgentInTerminalWithCurrentAgentLLM(agentType:workingDirectoryOverride:)` (Session-Proxy, Backend-Variablen, Modell, `CLAUDE_CODE_DISABLE_AGENT_VIEW=1` seit #130). Ein Plugin-Skript hat keinen Zugang dazu und darf sie nicht nachbauen (doppelte Backend-Logik). ## Umfang Neuer Endpunkt im Mac-Server (`IrisRemoteServer.swift`): Claude Code im Terminal öffnen, mit - `cwd` (Pflicht, sonst Setting `claudeCodeProjectDirectory`), - `session_id` (optional: `--resume <id>`; ohne = neue Session), - `name` (optional: `--name`, damit `/resume` den Namen zeigt). Ruft dieselbe Funktion wie die Header-Buttons; `buildClaudeCodeTerminalScript` bekommt dafür optionale Parameter für `--resume` und `--name`. Nur Mac, nur Claude Code. ## Zu klären - **Auth für Plugin-Skripte (entschieden, PR #133):** Loopback ohne Bearer, wie `/notify` und `/agent`; kein Keychain-Zugriff. - **Version:** Plugin braucht dann `iris_min_version` der App-Version mit dem Endpunkt. - Läuft die Session schon (siehe `~/.claude/sessions/<pid>.json`), lehnt der Endpunkt ab oder meldet es; das prüft das Plugin vorher, der Endpunkt sollte es nicht still zulassen (eine Session = ein Prozess). - Wire-Protokoll: nur Mac-Server-intern, kein Client betroffen; Linux-Server bekommt den Endpunkt nicht. ## Tests Von Hand: Klick-Start öffnet Terminal.app mit richtigem Backend, Verzeichnis und `--resume`. Unit-Test für die Skript-Zeile (`--resume`, `--name`, Quoting von Pfad und Name).
Author
Owner

PR #133 gemergt: feat(companion): POST /claude-code/terminal öffnet Claude Code im Terminal, optional mit --resume und --name; cwd im Terminal-Skript gequotet (#132)
#133

Commits:

  • feat(companion): POST /claude-code/terminal öffnet Claude Code im Terminal, optional mit --resume und --name; cwd im Terminal-Skript gequotet (#132)
PR #133 gemergt: feat(companion): POST /claude-code/terminal öffnet Claude Code im Terminal, optional mit --resume und --name; cwd im Terminal-Skript gequotet (#132) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/133 Commits: - feat(companion): POST /claude-code/terminal öffnet Claude Code im Terminal, optional mit --resume und --name; cwd im Terminal-Skript gequotet (#132)
Author
Owner

PR #133

Geändert: POST /claude-code/terminal im Mac-Server (IrisRemoteServer.swift, handleClaudeCodeTerminal). Body: cwd (optional, muss ein existierendes Verzeichnis sein), session_id (optional, nur UUID, wird zu --resume), name (optional, max. 100 Zeichen, keine Steuerzeichen, wird zu --name). Ruft CompanionManager.openAgentInTerminalWithCurrentAgentLLM mit neuen optionalen Parametern resumeSessionID und sessionName; dieselbe Backend-Logik wie die Header-Buttons.

Auth (war offen): wie /notify und /agent nur von dieser Maschine ohne Bearer (isLocalhostNotify). Kein Keychain-Zugriff durch das Plugin.

Zusätzlich: Im Terminal-Skript wird das Arbeitsverzeichnis jetzt gequotet (cd '…'), vorher ungequotet; mit Werten aus einer Anfrage wäre das eine Einschleusungsstelle, und Pfade mit Leerzeichen gingen schon vorher nicht. --resume/--name sind ebenfalls gequotet.

Geprüft: Xcode-Build von Iris.xcodeproj (Dokument per Name) erfolgreich. Es gibt kein Swift-Testtarget; kein Laufzeittest, die laufende Iris ist noch der alte Stand.

Grenzen/offen: Laufzeittest nach Neubau (Aufruf per curl, Terminal öffnet mit Backend, Verzeichnis, --resume). Fallweise claudeCommandWithoutProxy (Proxy-Start schlägt fehl) liefert nur das Kommando ohne --resume/--name, bestehendes Verhalten, nicht angefasst. Wire-Doku (02-Wire-Protokoll.md, Auth-freie Routen) wird nachgezogen. Version für iris_min_version des Plugins steht mit dem nächsten Release fest.

## PR #133 **Geändert:** `POST /claude-code/terminal` im Mac-Server (`IrisRemoteServer.swift`, `handleClaudeCodeTerminal`). Body: `cwd` (optional, muss ein existierendes Verzeichnis sein), `session_id` (optional, nur UUID, wird zu `--resume`), `name` (optional, max. 100 Zeichen, keine Steuerzeichen, wird zu `--name`). Ruft `CompanionManager.openAgentInTerminalWithCurrentAgentLLM` mit neuen optionalen Parametern `resumeSessionID` und `sessionName`; dieselbe Backend-Logik wie die Header-Buttons. **Auth (war offen):** wie `/notify` und `/agent` nur von dieser Maschine ohne Bearer (`isLocalhostNotify`). Kein Keychain-Zugriff durch das Plugin. **Zusätzlich:** Im Terminal-Skript wird das Arbeitsverzeichnis jetzt gequotet (`cd '…'`), vorher ungequotet; mit Werten aus einer Anfrage wäre das eine Einschleusungsstelle, und Pfade mit Leerzeichen gingen schon vorher nicht. `--resume`/`--name` sind ebenfalls gequotet. **Geprüft:** Xcode-Build von `Iris.xcodeproj` (Dokument per Name) erfolgreich. Es gibt kein Swift-Testtarget; kein Laufzeittest, die laufende Iris ist noch der alte Stand. **Grenzen/offen:** Laufzeittest nach Neubau (Aufruf per curl, Terminal öffnet mit Backend, Verzeichnis, `--resume`). Fallweise `claudeCommandWithoutProxy` (Proxy-Start schlägt fehl) liefert nur das Kommando ohne `--resume`/`--name`, bestehendes Verhalten, nicht angefasst. Wire-Doku (`02-Wire-Protokoll.md`, Auth-freie Routen) wird nachgezogen. Version für `iris_min_version` des Plugins steht mit dem nächsten Release fest.
Author
Owner

PR #97 gemergt: docs(wire): POST /claude-code/terminal in den auth-freien Routen (iris/Iris#132)
alf/2ndbrain#97

Commits:

  • docs(wire): POST /claude-code/terminal in den auth-freien Routen (iris/Iris#132)
PR #97 gemergt: docs(wire): POST /claude-code/terminal in den auth-freien Routen (iris/Iris#132) https://forgejo.lewerken.duckdns.org/alf/2ndbrain/pulls/97 Commits: - docs(wire): POST /claude-code/terminal in den auth-freien Routen (iris/Iris#132)
Author
Owner

Abgeschlossen

Endpunkt POST /claude-code/terminal gemergt (PR #133, Wire-Doku PR #97). „Fortsetzen“ und „Neu anlegen“ aus dem Canvas von iris-claude-sessions funktionieren in der echten App.

Geschlossen auf Alfs ausdrückliches Wort (2026-10-21).

## Abgeschlossen Endpunkt `POST /claude-code/terminal` gemergt (PR #133, Wire-Doku PR #97). „Fortsetzen“ und „Neu anlegen“ aus dem Canvas von iris-claude-sessions funktionieren in der echten App. Geschlossen auf Alfs ausdrückliches Wort (2026-10-21).
alf closed this issue 2026-10-21 21:55:22 +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#132
No description provided.