Reine Umbenennung, kein Verhalten geändert — bewusst als eigener Commit, damit „umbenannt" und „umgebaut" im Nachhinein auseinanderzuhalten sind. 712 mal `Flixy`, 778 mal `flixy`, 7 mal `FLIXY` in 169 Dateien, dazu 25 Pfade. Ziele: `Halo`, `HaloTV`, `HaloTopShelf`, `HaloUITests`, `HaloKit` mit `HaloDesign`, `HaloDownloads`, `HaloPlayback` und `HaloProbe`. `MediaKit`, `JellyfinKit` und `DownloadWidget` tragen den Namen nicht und bleiben. `docs/superpowers/specs/` ist ausgenommen. Datierte Entwurfsdokumente sind ein Protokoll getroffener Entscheidungen; sie nachträglich umzuschreiben hiesse, die Vergangenheit zu glätten. **Die Bundle-ID wandert mit** — ausdrücklich so gewollt, mit bekanntem Preis: `com.scarriffleservices.halo` ist für iOS eine *andere* App. Die installierte Fassung bleibt daneben stehen, mit Downloads und Anmeldung in ihrem Container; Halo startet leer. Einmal neu anmelden, heruntergeladene Folgen einmal neu laden. Dasselbe gilt für die App-Gruppe, die sich TV-App und Top Shelf teilen. **Eine Folge davon, die beim Entscheiden noch nicht auf dem Tisch lag:** der Aufräumschritt aus dem vorigen Commit kommt an die alten Plex-Token nicht mehr heran. Der Schlüsselbund grenzt nach Team und Bundle-Kennung ab — was unter `…flixy` liegt, ist für `…halo` unerreichbar. Erledigt wird es trotzdem, nur anders: **die alte App löschen.** iOS räumt deren Schlüsselbund-Einträge beim Deinstallieren mit ab. Der Code bleibt stehen, weil er für jeden Stand vor dieser Umbenennung richtig ist und im Jahr einen Startvergleich kostet. Die Projektdatei ist aus `project.yml` neu erzeugt, der alte Ordner gelöscht statt umbenannt — sie steht ohnehin nicht im Repo. Das Verzeichnis des Repos selbst heißt weiter `Flixy`; das umzubenennen ist ein Handgriff ausserhalb des Projekts. 368 Tests grün. iOS und tvOS bauen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
63 lines
3.1 KiB
Swift
63 lines
3.1 KiB
Swift
// swift-tools-version: 6.2
|
|
import PackageDescription
|
|
|
|
let package = Package(
|
|
name: "HaloKit",
|
|
// Quellsprache ist Englisch, damit die Schlüssel im Code lesbar bleiben.
|
|
// Deutsch kommt als Übersetzung dazu; die Systemsprache entscheidet.
|
|
defaultLocalization: "en",
|
|
// macOS steht hier nur, damit `swift test` die Logik-Tests ohne
|
|
// Simulator laufen lassen kann — das spart bei jedem Durchlauf Minuten.
|
|
// Welche Plattformen die Apps bedienen, legt project.yml fest: iOS für
|
|
// Halo, tvOS für HaloTV.
|
|
platforms: [.iOS(.v26), .macOS(.v26), .tvOS(.v26)],
|
|
products: [
|
|
.library(name: "MediaKit", targets: ["MediaKit"]),
|
|
.library(name: "JellyfinKit", targets: ["JellyfinKit"]),
|
|
.library(name: "HaloDesign", targets: ["HaloDesign"]),
|
|
.library(name: "HaloPlayback", targets: ["HaloPlayback"]),
|
|
.library(name: "HaloDownloads", targets: ["HaloDownloads"]),
|
|
],
|
|
targets: [
|
|
// Sprechen mit dem Server: Anmeldung, Endpunkte, Modelle. Kein SwiftUI,
|
|
// damit die gesamte Protokoll-Schicht ohne Oberfläche testbar bleibt.
|
|
// Die neutrale Grundschicht: Typen und Rechnungen, die für jeden
|
|
// Server gelten. Hängt von nichts ab — genau das macht sie zur
|
|
// Grundlage, auf der jeder Server und später das Web-Projekt
|
|
// dasselbe meinen.
|
|
.target(name: "MediaKit"),
|
|
.testTarget(name: "MediaKitTests", dependencies: ["MediaKit"]),
|
|
|
|
|
|
// Jellyfin. Eigenes Target auf der neutralen Schicht — ein Server,
|
|
// eine Schachtel. Kommt ein zweiter dazu, steht er daneben und
|
|
// nicht darin; herausnehmen heisst dann, ein Verzeichnis zu löschen.
|
|
.target(name: "JellyfinKit", dependencies: ["MediaKit"], resources: [.process("Localizable.xcstrings")]),
|
|
.testTarget(
|
|
name: "JellyfinKitTests",
|
|
dependencies: ["JellyfinKit"],
|
|
resources: [.copy("Fixtures")]
|
|
),
|
|
|
|
// Ein Werkzeug für die Fragen, die reines HTTP sind — ohne Oberfläche,
|
|
// ohne Gerät, ohne Upload. Eine Runde dauert damit Sekunden statt
|
|
// eines halben Tages, und das Upload-Kontingent bleibt für Builds.
|
|
.executableTarget(name: "HaloProbe", dependencies: ["MediaKit", "JellyfinKit"]),
|
|
|
|
// Farben, Typografie, wiederkehrende Bausteine. Hängt bewusst von
|
|
// nichts ab: dadurch bleibt das Umstellen der Akzentfarbe ein
|
|
// Token-Wechsel und keine Suche quer durch die App.
|
|
.target(name: "HaloDesign", resources: [.process("Localizable.xcstrings")]),
|
|
.testTarget(name: "HaloDesignTests", dependencies: ["HaloDesign"]),
|
|
|
|
// Die Wiedergabe-Abstraktion samt AVPlayer-Engine und der Entscheidung
|
|
// direkt / umpacken / umrechnen.
|
|
.target(name: "HaloPlayback", dependencies: ["MediaKit"]),
|
|
.testTarget(name: "HaloPlaybackTests", dependencies: ["HaloPlayback"]),
|
|
|
|
// Warteschlange, Hintergrundübertragung, Offline-Bestand.
|
|
.target(name: "HaloDownloads", dependencies: ["MediaKit"], resources: [.process("Localizable.xcstrings")]),
|
|
.testTarget(name: "HaloDownloadsTests", dependencies: ["HaloDownloads"]),
|
|
]
|
|
)
|