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

4.6 KiB

name, description, metadata
name description metadata
ghostty-miniterm-einbindung Prüfung, ob Ghostty/libghostty statt SwiftTerm in den Mac-App-Builder eingebunden werden kann
node_type type originSessionId
memory project 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.swiftGhosttyApp (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.