- Drive chat list, timeline and forward picker from SwiftData @Query instead of AppModel's in-memory arrays; inject the per-account ModelContext from RootView with an in-memory fallback. - Physically delete locally deleted messages (context.delete) and purge rows marked deleted by older builds on store open, so @Query views never resurrect them. - Delete the legacy JSON snapshot only after a successful import save and restore the completeUntilFirstUserAuthentication data protection attribute on the store file. - Mirror the old ChatArchive tolerant decoding in LegacyArchiveImporter so snapshots from older schema versions (missing reactions, isGroupMessage, roster fields) still import. - Cover the new behaviour in ArchiveStoreTests and guard it with new verify.sh invariants; update AGENTS.md, ARCHITECTURE.md and SECURITY.md.
2.9 KiB
2.9 KiB
Repository Guidelines
Luma is an XMPP client for iOS, iPadOS, macOS, and watchOS, built with SwiftUI
and the Martin / MartinOMEMO libraries. The Xcode project is generated from
project.yml by XcodeGen — never edit Luma.xcodeproj directly.
Project Structure
Sources/App/— iOS/macOS app entry point (LumaApp.swift).Sources/Shared/— shared code:Models/— value types and pure policy enums (ArchiveSyncPagination,ChatTypingPolicy, …) plus the SwiftData@Modelclasses (ChatMessage,Conversation).UI/— SwiftUI views; chat list, timeline and forward picker read SwiftData through@Query(MainChatView,ChatView,ForwardMessageView).XMPP/—XMPPService(MAM/OMEMO/MUC),LumaCallEngine, OMEMO store.Persistence/—ArchiveStore(per-account SwiftData container),ArchiveMetadataRecord(durable MAM checkpoint metadata),LegacyArchiveImporter(one-time legacy JSON snapshot migration), preferences.Services/,Security/— media, notifications, credentials.
Sources/Watch/— single-target watchOS app.Tests/— XCTest unit tests.Resources/,Config/,Brand/,Docs/— assets, plists/entitlements, icons, architecture/security docs.
Build, Test & Development
make project— regenerateLuma.xcodeprojfromproject.yml(requiresbrew install xcodegen).make open— regenerate and open Xcode.make verify— runScripts/verify.sh: grep-based structural invariants plus an optional simulator build.make clean— remove the generated project and DerivedData.xcodebuild test -project Luma.xcodeproj -scheme Luma \ -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max'— build and run the test suite.
Coding Style
- Swift 5.9; 4-space indentation (set in
project.yml). - UI-facing state is
@MainActor(AppModel,XMPPService); keep heavy work (OMEMO decryption, media, persistence) off the main actor. - Prefer small, pure value types and unit-testable policy enums over inline branching.
- UI strings are Russian; identifiers and code comments are English.
- No formatter/linter;
Scripts/verify.shis the guard — keep its greps in sync when you change constants or symbols.
Testing
- XCTest with
@testable import Luma; one file per model/policy (e.g.,ArchiveSyncPaginationTests.swift), methods namedtest.... - Unit-test pure logic (policies, pagination, checkpoints); network/UI flows are verified manually.
- When a policy constant changes, update the matching
Tests/*assertions and theScripts/verify.shguard in the same commit.
Commit & Pull Request
- Short, imperative, English subject lines (see
git log: "mam fixes", "fix errors and warnings"). - CI (
.github/workflows/ios.yml) runsxcodebuild teston push tomain/developand on PRs tomain; PRs must keep it green. - Update
README.md/Docs/*whenever behaviour or architecture changes.