Files
Luma/AGENTS.md
T
wt efe3986ba5 add a telegram-style bottom tab bar to the main screen
- Replace the sidebar-based MainChatView with MainTabView: a custom
  bottom bar with Контакты / Звонки / Чаты / Настройки that looks the
  same on iOS and macOS, and open chats via push navigation.
- Put the search field above the chat and contact lists (searchable on
  iOS, an inline field on macOS) and add an aggregated call-history
  screen backed by model.callHistoryMessages.
- Embed SettingsView as a tab, update verify.sh guards, and keep CI on
  deterministic unit tests while the UI tests stay runnable manually.
2026-08-30 01:39:54 +07:00

3.1 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 @Model classes (ChatMessage, Conversation).
    • UI/ — SwiftUI views; chat/contact lists read SwiftData through @Query (MainTabView, ChatView, ForwardMessageView); the main screen is a Telegram-style bottom tab bar (Контакты/Звонки/Чаты/ Настройки).
    • XMPP/ — XMPPService (MAM/OMEMO/MUC), LumaCallEngine, OMEMO store, SASLprep (RFC 4013), SCRAM-SHA-512 mechanism, SASL failure observer/messages.
    • 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 — regenerate Luma.xcodeproj from project.yml (requires brew install xcodegen).
  • make open — regenerate and open Xcode.
  • make verify — run Scripts/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.sh is 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 named test....
  • Unit-test pure logic (policies, pagination, checkpoints); network/UI flows are verified manually.
  • When a policy constant changes, update the matching Tests/* assertions and the Scripts/verify.sh guard 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) runs xcodebuild test on push to main/develop and on PRs to main; PRs must keep it green.
  • Update README.md / Docs/* whenever behaviour or architecture changes.