Files
claude-projects/limbach/memory/ghostty-miniterm-einbindung.md
T

41 lines
4.6 KiB
Markdown

---
name: ghostty-miniterm-einbindung
description: "Prüfung, ob Ghostty/libghostty statt SwiftTerm in den Mac-App-Builder eingebunden werden kann"
metadata:
node_type: memory
type: project
originSessionId: c054beab-7d0a-44f2-992f-ee3f9304358e
---
Projekt `__mac-cluade-app-builder` (in /home/marcuh/claude-projects/) baut pro Aufruf eine eigenständige macOS-`.app` mit eigener Bundle-ID → eigenes Dock-Icon + eigener ⌘-Tab-Eintrag. Ein gemeinsames Binary (Sources/MiniTerm/main.swift) liest pro Bundle Info.plist-Keys (MTCommand, MTWorkingDirectory, MTFontSize, MTFontName, MTWindowTitle); make-app.sh assembliert das Bundle. Nutzt heute **SwiftTerm** (SPM-Dependency). Funktioniert.
Frage: SwiftTerm durch **Ghostty** ersetzen, weil Terminal besser (GPU-Rendering, Ligaturen, vollere Kompatibilität).
Befund:
- Ghostty.app als Ganzes hilft nicht — eine gemeinsame App löst die Pro-Projekt-Identität (Dock/⌘-Tab) nicht (gleiche `--class`-Grenze wie im README). Lösung bleibt: pro Projekt eigenes Bundle.
- Richtiger Weg: **libghostty** (Zig-Kern, C-API) statt SwiftTerm in die eigene Swift-Hülle linken — analog zur jetzigen Konstruktion. Offizielles Minimalbeispiel als Vorlage: `ghostling` (github.com/ghostty-org/ghostling).
- Genutzte Funktionsfläche ist winzig (Prozess in Login-Shell starten, rendern, Font, Shift+Enter-Key-Monitor, Copy/Paste) → laufendes API-Risiko gering, obwohl libghostty-Embedding-API offiziell noch nicht stabil ist.
- Einmaliger Aufwand = Integration: **Zig-Toolchain** auf den Mac, libghostty aus Quellbaum bauen, C-Header + lib manuell in die Swift-Hülle linken. Kein fertiges SPM-Paket wie SwiftTerm.
- Zig = einzelnes self-contained Binary (Tarball, kein Installer), aber **bestimmte von Ghostty gepinnte Version** nötig. Gehört auf den Mac, nicht auf Linux (Build geht nur unter macOS, Xcode CLT/AppKit).
- Bestehende Mac-Tools reichen sonst: swift (Xcode CLT), sips/iconutil/codesign (macOS built-in). Nur Zig ist neu.
- Bundle-Hülle, make-app.sh und Shift+Enter-Key-Monitor bleiben unverändert; SwiftTerm-Variante bleibt als Rückfallpunkt funktionsfähig.
Projekt umgezogen nach `~/projects/claude-app-builder-4-mac` (eigenes Git, Remote git.lintus.art); aus `~/claude-projects` entfernt.
Stand 2026-06-21: **libghostty erfolgreich gebaut.** Volle macOS-Variante mit Metal-Renderer (Surface-/App-API: `ghostty_app_new`, `ghostty_surface_new/draw/key`…) liegt als `vendor/libghostty/{lib/libghostty.a (arm64, 135 MB), include/, patches/, README.md}` im Projekt. Quelle Ghostty v1.3.1 + Zig 0.15.2.
Stolpersteine (alle gelöst, im README/Patch dokumentiert):
- Zig 0.15.2 linkt auf dem **Host (macOS 26.5)** kein natives Binary — libSystem-Inkompatibilität mit dem 26er-SDK (Auto-Erkennung von `26.x` scheitert; explizit `26.0` ginge). 0.16/0.17 linken, aber Ghostty 1.3.1 baut nicht damit (ArrayList/EnvMap/Writer-Drift + requireZig). Kein Patch am Host möglich.
- Lösung: Build in **macOS-15-VM** (tart, cirruslabs-Image, Apple-Silicon-Host) mit aktivem **CLT (15.5-SDK)** → Zig linkt. `metal`-Shader-Compiler nur per `DEVELOPER_DIR` aus Xcode geholt.
- 3 Build-Patches an Ghostty: build.zig (macOS-libghostty.a-Install freischalten, shared `.so` raus), GhosttyXCFramework.zig (nur macOS-Slice, kein iOS/Universal), MetallibStep.zig (metal via Xcode-DEVELOPER_DIR).
Link gegen Host-Swift verifiziert: Smoke-Test (modulemap + `swiftc -lghostty` + Frameworks AppKit/Metal/MetalKit/QuartzCore/CoreText/CoreGraphics/CoreVideo/IOSurface/Carbon/Foundation/CoreFoundation, `-lc++`) linkt die arm64-`.a` auf macOS 26.5/SDK-26 und ruft `ghostty_info()` (Cross-SDK unkritisch).
**Surface-Integration gebaut und lauffähig** (Stand 2026-06-21): MiniTerm linkt libghostty, kompiliert, läuft, Test-`.app` startet ohne Crash mit GPU-gerenderter Login-Shell.
- `Sources/CGhostty/` — C-Modul (ghostty.h + modulemap) für die C-API.
- `Sources/MiniTerm/Ghostty.swift``GhosttyApp` (init/config/runtime-callbacks/tick) + `GhosttySurfaceView` (NSView, `ghostty_surface_new` mit nsview-Zeiger, Größe/Scale/Fokus, Tastatur inkl. Shift+Enter→`ghostty_surface_text`, Maus/Scroll).
- `main.swift` — Engine-Wahl per Info.plist `MTEngine` (Default `ghostty`, `swiftterm` = Fallback; auch bei libghostty-Init-Fehler).
- `Package.swift` — CGhostty-Target + linkerSettings (`-Lvendor/libghostty/lib -lghostty` + Frameworks AppKit/Metal/MetalKit/QuartzCore/CoreText/CoreGraphics/CoreVideo/IOSurface/Carbon, `-lc++`).
Offen/zu prüfen: visuelle Bestätigung (Rendering, Tippen, Resize); Clipboard-Callbacks sind no-op (kein ⌘C/⌘V über libghostty); Font-Family wird nicht gesetzt (nur font_size); arm64-only. VM + Scratch abgeräumt.