Files
onyx/Packages/OnyxKit/Package.swift
T
ScarriffleandClaude Opus 5 3da673662f Zwischenablage, Notizen und der Gesichtsvergleich
Drei neue Module nach dem Bauplan von `ShelfProvider`: reine Regeln getrennt vom
Zustand, versionierte Indexdatei, Inhalte in Dateien statt in `UserDefaults` —
was dort steht, liest jedes Programm mit `defaults read` mit.

Die Zwischenablage achtet `ConcealedType`, `TransientType` und
`AutoGeneratedType`. Diese Marken sind eine Verabredung zwischen Programmen und
kein Systemdienst; wer sie missachtet, sammelt fremde Passwörter ein.

Der Gesichtsvergleich stand im Plan als der eine echte Unsicherheitsfaktor. Ein
Spike hat ihn erledigt: `VNGenerateFaceprintRequest` gibt es nicht, aber
`VNGenerateImageFeaturePrintRequest` ist öffentlich, liefert 768 Elemente und
ein Abstandsmaß — Faktor 3,5 Trennschärfe. Kein eigenes CoreML-Modell nötig.

`FaceMatcher` entscheidet über mehrere Posen, mehrere Einzelbilder und eine
Sperre nach Fehlversuchen. Die Schwelle liegt bewusst nicht mittig: ein falsches
Ja ist ein Fremder am entsperrten Rechner, ein falsches Nein nur ein Passwort,
das man ohnehin kennt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 21:06:06 +02:00

100 lines
5.4 KiB
Swift

// swift-tools-version: 6.2
import PackageDescription
let package = Package(
name: "OnyxKit",
// Quellsprache ist Englisch, damit die Schlüssel im Code lesbar bleiben.
// Deutsch kommt als Übersetzung dazu; die Systemsprache entscheidet.
defaultLocalization: "en",
platforms: [.macOS(.v26)],
products: [
.library(name: "OnyxCore", targets: ["OnyxCore"]),
.library(name: "OnyxHelperProtocol", targets: ["OnyxHelperProtocol"]),
.library(name: "OnyxDesign", targets: ["OnyxDesign"]),
.library(name: "OnyxNotch", targets: ["OnyxNotch"]),
.library(name: "OnyxWidgetKit", targets: ["OnyxWidgetKit"]),
.library(name: "OnyxMenuBar", targets: ["OnyxMenuBar"]),
.library(name: "CalendarProvider", targets: ["CalendarProvider"]),
.library(name: "WeatherProvider", targets: ["WeatherProvider"]),
.library(name: "MediaProvider", targets: ["MediaProvider"]),
.library(name: "MetricsProvider", targets: ["MetricsProvider"]),
.library(name: "NetworkProvider", targets: ["NetworkProvider"]),
.library(name: "AudioProvider", targets: ["AudioProvider"]),
.library(name: "ShelfProvider", targets: ["ShelfProvider"]),
.library(name: "ActivityProvider", targets: ["ActivityProvider"]),
.library(name: "ClipboardProvider", targets: ["ClipboardProvider"]),
.library(name: "NotesProvider", targets: ["NotesProvider"]),
.library(name: "FaceProvider", targets: ["FaceProvider"]),
],
targets: [
// Der String-Katalog muss ausdrücklich als Ressource stehen — sonst gibt
// es kein `Bundle.module`, und die Übersetzungen wären zur Laufzeit
// unauffindbar.
.target(name: "OnyxCore", resources: [.process("Localizable.xcstrings")]),
.testTarget(name: "OnyxCoreTests", dependencies: ["OnyxCore"]),
// Geteilt zwischen App und privilegiertem Helfer — deshalb ohne jede
// Abhängigkeit: der Helfer läuft als root und soll so wenig Code wie
// möglich enthalten.
.target(name: "OnyxHelperProtocol"),
.testTarget(name: "OnyxHelperProtocolTests", dependencies: ["OnyxHelperProtocol"]),
.target(name: "OnyxDesign"),
.target(name: "OnyxNotch", dependencies: ["OnyxDesign"],
resources: [.process("Localizable.xcstrings")]),
.testTarget(name: "OnyxNotchTests", dependencies: ["OnyxNotch"]),
.testTarget(name: "OnyxDesignTests", dependencies: ["OnyxDesign"]),
.target(name: "OnyxWidgetKit", dependencies: ["OnyxDesign"]),
.testTarget(name: "OnyxWidgetKitTests", dependencies: ["OnyxWidgetKit"]),
.target(name: "OnyxMenuBar", dependencies: ["OnyxDesign", "OnyxWidgetKit"]),
.testTarget(name: "OnyxMenuBarTests", dependencies: ["OnyxMenuBar"]),
.target(name: "CalendarProvider", dependencies: ["OnyxDesign", "OnyxWidgetKit"],
resources: [.process("Localizable.xcstrings")]),
.testTarget(name: "CalendarProviderTests", dependencies: ["CalendarProvider"]),
.target(name: "WeatherProvider", dependencies: ["OnyxDesign", "OnyxWidgetKit"],
resources: [.process("Localizable.xcstrings")]),
.testTarget(name: "WeatherProviderTests", dependencies: ["WeatherProvider"]),
.target(name: "MediaProvider", dependencies: ["OnyxDesign", "OnyxWidgetKit"],
resources: [.process("Localizable.xcstrings")]),
.testTarget(name: "MediaProviderTests", dependencies: ["MediaProvider"]),
.target(name: "MetricsProvider", dependencies: ["OnyxDesign", "OnyxWidgetKit", "OnyxMenuBar", "OnyxHelperProtocol"],
resources: [.process("Localizable.xcstrings")]),
.testTarget(name: "MetricsProviderTests", dependencies: ["MetricsProvider"]),
.target(name: "NetworkProvider", dependencies: ["OnyxDesign", "OnyxWidgetKit", "OnyxMenuBar", "MetricsProvider"],
resources: [.process("Localizable.xcstrings")]),
.testTarget(name: "NetworkProviderTests", dependencies: ["NetworkProvider"]),
.target(name: "AudioProvider", dependencies: ["OnyxDesign", "OnyxWidgetKit"],
resources: [.process("Localizable.xcstrings")]),
.testTarget(name: "AudioProviderTests", dependencies: ["AudioProvider"]),
.target(name: "FaceProvider"),
.testTarget(name: "FaceProviderTests", dependencies: ["FaceProvider"]),
.target(name: "NotesProvider", dependencies: ["OnyxDesign", "OnyxWidgetKit"],
resources: [.process("Localizable.xcstrings")]),
.testTarget(name: "NotesProviderTests", dependencies: ["NotesProvider"]),
.target(name: "ClipboardProvider", dependencies: ["OnyxDesign", "OnyxWidgetKit"],
resources: [.process("Localizable.xcstrings")]),
.testTarget(name: "ClipboardProviderTests", dependencies: ["ClipboardProvider"]),
.target(name: "ShelfProvider", dependencies: ["OnyxDesign", "OnyxWidgetKit"],
resources: [.process("Localizable.xcstrings")]),
// Live Activities: die Warteschlange ist reine Rechnung ohne AppKit,
// die Darstellung hängt am Notch-Panel.
.target(name: "ActivityProvider", dependencies: ["OnyxDesign", "OnyxNotch"]),
.testTarget(name: "ShelfProviderTests", dependencies: ["ShelfProvider"]),
.testTarget(name: "ActivityProviderTests", dependencies: ["ActivityProvider"]),
]
)