Architektura

Małe monorepo: jeden współdzielony pakiet Swift z modelem danych i dwie cienkie natywne aplikacje (macOS i iOS) zbudowane na nim. Czysty Swift — SwiftUI + AppKit na Macu, SwiftUI na iOS.

Układ repozytorium

Packages/MemoryKit/   współdzielone modele i reguły: elementy, Tablice, retencja, zapis, interfejsy sync
apps/macos/           aplikacja macOS (monitor, panel, Tablice, przypomnienia, wklejanie)
apps/ios/             aplikacja iOS (lokalna pamięć, gesty, szczegóły, Tablice, przypomnienia)
Resources/Info.plist  Info.plist dla builda macOS
project.yml           konfiguracja XcodeGen → generuje MemoryApp.xcodeproj
build.sh              szybki build macOS przez SwiftPM (bez Xcode)

MemoryKit — współdzielony rdzeń

Packages/MemoryKit to pakiet Swift zawierający model danych wspólny dla obu aplikacji. Celowo zależy wyłącznie od Foundation i CryptoKit — bez AppKit, bez UIKit — dzięki czemu kompiluje się bez zmian na macOS i iOS.

Aplikacja macOS (apps/macos)

KomponentOdpowiedzialność
ClipboardMonitorObserwuje NSPasteboard przez odpytywanie licznika zmian; klasyfikuje nowe treści, respektuje konwencję poufności org.nspasteboard i listę wykluczonych aplikacji.
HistoryStoreWłaściciel elementów i Tablic: atomowy zapis archiwum, bloby, deduplikacja, retencja czasowa, członkostwo, Loved/Saved, planowanie przypomnień i migracja.
PanelControllerWysuwany panel przywoływania. Panel nieaktywujący (wzorzec Spotlight) — aplikacja na wierzchu zachowuje fokus podczas przeglądania.
HistoryViewPanel SwiftUI: globalne wyszukiwanie, filtry, siatka kart, szybkie Loved/Saved, menu Tablic i przypomnień, klawiatura, drag & drop i menu kontekstowe.
LibraryViewWidok wszystkich Tablic, edytor Tablic, listy elementów i arkusze szczegółów/przypomnień.
ReminderSchedulerProsi o uprawnienie, planuje/anuluje lokalne powiadomienia i kieruje otwarcie do stabilnego ID elementu.
HotkeyManagerRejestruje globalny skrót V.
PasteHelperWkleja do aktywnej aplikacji, syntetyzując ⌘V (CGEvent); wymaga uprawnienia Dostępność. Wariant czysto-tekstowy dla ⌥↩.
SettingsViewPreferencje: retencja 30/60/90/120 dni lub bez limitu, wykluczone aplikacje, start przy logowaniu.
ColorHexParsowanie/wyświetlanie kolorów HEX dla podglądów kolorów.
main.swiftRozruch aplikacji: element paska menu (🧠), spięcie monitora, magazynu, panelu i skrótu.

Aplikacja iOS (apps/ios)

Aplikacja iOS (bundle id cc.memoryapp.ios) jest natywnym klientem tej samej pamięci co aplikacja na Maca, synchronizowanej przez iCloud w podpisanych buildach. Obsługuje globalne wyszukiwanie, gest lewo-do-Usuniętych/prawo-przypnij, dotknięcie do szczegółów, menu po przytrzymaniu, Loved/Saved, nazwane Tablice, przypomnienia i bezpieczne otwieranie linków.

KomponentOdpowiedzialność
MemoryAppApp / IOSAppDelegateWejście SwiftUI, konfiguracja kategorii powiadomień i kierowanie odpowiedzi do ID elementu.
IOSStoreLokalny magazyn elementów i Tablic: wyszukiwanie, członkostwo, przypomnienia, retencja, zapis archiwum i interfejs sync (aktywny w podpisanych buildach).
ContentViewLista, wyszukiwanie, szybkie Loved/Saved, gesty, menu po przytrzymaniu i dodawanie ze schowka.
IOSItemDetailViewArkusz szczegółów, bezpieczne linki, członkostwo w Tablicach i edytor przypomnienia.
IOSBoardsViewWidok wszystkich Tablic, zarządzanie własnymi Tablicami i listy zawężone do Tablicy.
IOSReminderSchedulerAutoryzacja, planowanie, anulowanie i uzgadnianie lokalnych powiadomień.

Przepływ danych (macOS)

kopiowanie w dowolnej aplikacji
      │
      ▼
NSPasteboard ──(odpytywanie)──▶ ClipboardMonitor
                                  │  klasyfikacja (text/link/color/image/file)
                                  │  pomijanie poufnych + wykluczonych aplikacji
                                  ▼
                            HistoryStore ──▶ wersjonowane archiwum + blobs/
                                  │  deduplikacja + Tablice + przypomnienia + retencja
                                  ▼
⌘⇧V ──▶ HotkeyManager ──▶ PanelController ──▶ HistoryView
                                  │
                     klik / ↩ / drag & drop
                                  ▼
                    schowek  ──▶ PasteHelper (⌘V do aktywnej aplikacji)

System budowania

Architektura synchronizacji iCloud

Podpisane buildy z uprawnieniami domyślnie używają CloudKitSyncEngine i zachowują lokalną kopię offline. Elementy, stan Usunięte i definicje Tablic trafiają do prywatnej bazy CloudKit użytkownika; SyncPocket App nie prowadzi serwera danych i nie może czytać archiwum. Każdy element ma modifiedAt: wygrywa nowsza zmiana, przy identycznym czasie wygrywa stan Usunięte, a konflikt zapisu jest ponawiany z najnowszym znacznikiem zmiany serwera. Izolowane testy UI używają NoopSyncEngine. Wydanie nadal wymaga podpisanego kontenera produkcyjnego i testu konfliktów na dwóch urządzeniach.