app foldee
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
# MiniTerm — winzige eigenständige Terminal-Apps für macOS
|
||||
|
||||
Ein minimaler, auf **SwiftTerm** basierender Terminal-Emulator. Sinn der Sache:
|
||||
jede erzeugte `.app` ist eine **eigene macOS-App mit eigener Bundle-ID** — also
|
||||
**eigenes Dock-Icon und eigener ⌘-Tab-Eintrag**. Genau das, was sich unter macOS
|
||||
mit `--class` (wie bei Alacritty/Ghostty unter Linux) *nicht* lösen lässt.
|
||||
|
||||
Jede App startet in einem konfigurierbaren **Arbeitsverzeichnis** und führt einen
|
||||
konfigurierbaren **Befehl** aus (z. B. `claude`). Für Claude Code reicht das
|
||||
locker — SwiftTerm ist ein vollwertiger xterm-256color-kompatibler Emulator.
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- macOS 13+ und **Xcode** bzw. die Command Line Tools (`xcode-select --install`)
|
||||
- Swift (kommt mit Xcode)
|
||||
|
||||
## Schnellstart
|
||||
|
||||
```bash
|
||||
cd MiniTerm
|
||||
chmod +x make-app.sh
|
||||
|
||||
./make-app.sh \
|
||||
--name "Claude · Projekt A" \
|
||||
--bundle-id com.deinname.claude.projekta \
|
||||
--workdir ~/code/projekt-a \
|
||||
--command "claude"
|
||||
```
|
||||
|
||||
Beim ersten Lauf wird das Binary einmal gebaut (`swift build -c release`,
|
||||
lädt SwiftTerm). Danach liegt die App in `~/Applications/Claude · Projekt A.app`
|
||||
— per Doppelklick starten, Dock-Icon erscheint als eigene App.
|
||||
|
||||
## Mehrere Apps (eigene Icons/Configs)
|
||||
|
||||
Einfach pro App einmal aufrufen. Das Binary wird nur einmal kompiliert und
|
||||
wiederverwendet:
|
||||
|
||||
```bash
|
||||
./make-app.sh --name "Claude · Webshop" --bundle-id com.deinname.claude.webshop \
|
||||
--workdir ~/code/webshop --command "claude" --icon ./icons/shop.icns
|
||||
|
||||
./make-app.sh --name "Claude · Infra" --bundle-id com.deinname.claude.infra \
|
||||
--workdir ~/code/infra --command "claude" --icon ./icons/infra.icns
|
||||
|
||||
./make-app.sh --name "Scratch Shell" --bundle-id com.deinname.scratch \
|
||||
--workdir ~ --command "" # leer = einfache Shell
|
||||
```
|
||||
|
||||
## Optionen
|
||||
|
||||
| Flag | Pflicht | Bedeutung |
|
||||
|----------------|---------|--------------------------------------------------------|
|
||||
| `--name` | ja | Anzeigename + Dateiname der App |
|
||||
| `--bundle-id` | ja | Eindeutige Bundle-ID (gibt die eigene App-Identität) |
|
||||
| `--workdir` | nein | Startverzeichnis (`~` wird expandiert; leer = Home) |
|
||||
| `--command` | nein | Befehl beim Start (leer = nur eine Login-Shell) |
|
||||
| `--font-size` | nein | Schriftgröße (Default 13) |
|
||||
| `--font` | nein | Schriftfamilie (Default Menlo; Fallback System-Mono) |
|
||||
| `--icon` | nein | PNG/JPG (wird automatisch konvertiert) oder `.icns` |
|
||||
| `--out` | nein | Zielordner (Default `~/Applications`) |
|
||||
|
||||
## Icon aus einem PNG
|
||||
|
||||
`--icon` nimmt direkt ein **PNG** (oder JPG) — das Skript erzeugt daraus
|
||||
automatisch alle nötigen Größen und das `.icns` (via `sips`/`iconutil`):
|
||||
|
||||
```bash
|
||||
./make-app.sh --name "Claude · Infra" --bundle-id com.deinname.claude.infra \
|
||||
--workdir ~/code/infra --command "claude" --icon ~/Downloads/infra.png
|
||||
```
|
||||
|
||||
Am besten ein **quadratisches** Bild nehmen, sonst verzerrt `sips` es. Eine
|
||||
fertige `.icns`-Datei kannst du weiterhin auch direkt angeben.
|
||||
|
||||
## Wie die Konfiguration funktioniert
|
||||
|
||||
Das kompilierte Binary ist für alle Apps identisch. Die Unterschiede stecken in
|
||||
der `Info.plist` jedes Bundles (Schlüssel `MTCommand`, `MTWorkingDirectory`,
|
||||
`MTWindowTitle`, `MTFontSize`, `MTFontName`). Das Programm liest sie beim Start aus
|
||||
`Bundle.main`. So genügt ein Build für beliebig viele Apps.
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Der Befehl läuft immer über eine **Login-Shell** (`zsh -l`), damit PATH stimmt
|
||||
(Homebrew, `~/.local/bin` usw.) und `claude` gefunden wird.
|
||||
- Nach Beenden des Befehls fällt das Fenster in eine normale Shell zurück
|
||||
(`exec zsh -l`), schließt sich also nicht sofort.
|
||||
- Die App ist **ad-hoc signiert**. Beim ersten Start ggf. Rechtsklick → „Öffnen",
|
||||
falls Gatekeeper meckert.
|
||||
- SwiftTerm-Version: im `Package.swift` auf `branch: "main"`. Für reproduzierbare
|
||||
Builds dort auf einen festen Tag (`from: "..."`) umstellen.
|
||||
|
||||
## Tastatur
|
||||
|
||||
- **Enter** sendet wie gewohnt einen Wagenrücklauf (`\r`) → Eingabe absenden.
|
||||
- **Shift+Enter** sendet einen Zeilenumbruch (`\n`) → für mehrzeilige Eingaben,
|
||||
z. B. in Claude Code. Gilt auch für Enter auf dem Ziffernblock.
|
||||
- ⌘C / ⌘V funktionieren über das Edit-Menü.
|
||||
Reference in New Issue
Block a user