Files
wt da9e17f45f
Android CI / Build and Test (push) Failing after 13m25s
iOS CI / Build and Test SwiftUI App (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build Unsigned iOS IPA (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build macOS ZIP (push) Canceled after 0s
added AGENTS.md and docs in root dir
2026-09-08 13:36:43 +07:00

168 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGENTS.md — корень монорепозитория Balance
Этот файл — точка входа для AI-агентов и разработчиков, работающих в
репозитории Balance. Он описывает, как устроены три подпроекта, как они
связаны друг с другом, и куда идти за подробностями. **Каждый подпроект
имеет собственный `AGENTS.md` с детальными правилами — читай его перед
любым изменением внутри соответствующей папки.**
## Что это за проект
Balance — приложение для учёта личных финансов, доступное на пяти
платформах, которые используют одну и ту же доменную модель и один и
тот же протокол синхронизации:
| Платформа | Папка | Стек |
| --- | --- | --- |
| iOS 17+ | `Balance/` | SwiftUI + SwiftData |
| macOS 14+ | `Balance/` (`BalanceMac/`) | SwiftUI + SwiftData |
| watchOS 10+ | `Balance/` (`BalanceWatch/`) | SwiftUI + SwiftData |
| Android 8.0+ | `BalanceAndroid/` | Kotlin + Jetpack Compose + Room |
| Web (встроен в сервер) | `BalanceServer/` | Go + embedded static client |
| Сервер синхронизации | `BalanceServer/` | Go + SQLite |
Все клиенты — iOS, macOS, watchOS, Android, web — синхронизируются через
один и тот же self-hosted сервер (`BalanceServer`) по единому HTTP(S)
API: регистрация, вход, refresh-токены, push/pull изменений с курсором,
tombstone-удаления, пользовательские категории и месячные бюджеты.
## Структура репозитория
```text
Balance/ # монорепозиторий
├── AGENTS.md # этот файл — общие правила для агентов
├── README.md # общий обзор и точки входа
├── docs/ # сводная документация по всему проекту
│ ├── ARCHITECTURE.md # как связаны клиенты и сервер
│ ├── SYNC_PROTOCOL.md # единый протокол синхронизации
│ ├── DATA_MODEL.md # сопоставление сущностей между платформами
│ ├── SECURITY.md # сквозные требования безопасности
│ └── DEVELOPMENT.md # как собрать и проверить все три проекта
│
├── Balance/ # Xcode-проект: iOS + macOS + watchOS
│ ├── AGENTS.md # правила для Apple-клиента
│ ├── README.md
│ └── docs/ # ARCHITECTURE, DATA_MODEL, SYNC, DEVELOPMENT, PRODUCT
│
├── BalanceAndroid/ # Android-проект (Gradle/Kotlin)
│ ├── AGENTS.md # правила для Android-клиента
│ ├── README.md
│ └── docs/ # ARCHITECTURE, DATA_MODEL, SYNC, DEVELOPMENT, PRODUCT
│
└── BalanceServer/ # Go-сервер синхронизации + web-клиент
├── AGENTS.md # правила для сервера
├── README.md
└── docs/ # ARCHITECTURE, API, DATA_MODEL, SYNC, SECURITY, DEVELOPMENT, DEPLOYMENT, PRODUCT
```
## Как работать в этом репозитории
### 1. Сначала пойми, в каком подпроекте изменение
Каждый подпроект — независимый билд с собственными зависимостями,
тестами и CI-шагами. Изменения в одной папке не должны требовать
правок в другой, **кроме** случаев, когда меняется общий контракт:
- HTTP API / формат sync-запросов и ответов (`BalanceServer`);
- набор синхронизируемых полей сущности (транзакция, категория, бюджет);
- правила финансовых расчётов (баланс, корректировки, аналитика).
Если меняется общий контракт — обнови все три подпроекта согласованно
и синхронизируй документацию (`docs/SYNC_PROTOCOL.md`, а также
`docs/SYNC.md`/`docs/API.md`/`docs/DATA_MODEL.md` внутри каждой папки).
### 2. Единая доменная модель
Три клиента независимо реализуют одну и ту же модель на своём стеке
(SwiftData / Room), но со семантически одинаковыми сущностями:
- **Транзакция** (доход/расход, сумма, дата, заметка, категория —
хранится snapshot'ом имени/иконки/цвета категории на момент операции);
- **Пользовательская категория** (имя, иконка/emoji, цвет);
- **Месячный бюджет** (категория, месяц, лимит);
- **Tombstone/deletion journal** для распространения удалений между
устройствами.
Общие правила расчётов (баланс = доходы − расходы; корректировки
баланса учитываются в общем балансе, но не в периодической аналитике;
расходы группируются по имени категории) продублированы в:
- `Balance/Balance/Utilities/FinanceCalculations.swift` (Apple);
- `BalanceAndroid/.../data/FinanceMath.kt` (Android).
При изменении этих правил на одной платформе — переноси изменение на
другую и обновляй оба набора тестов
(`BalanceTests/FinanceCalculationsTests.swift`, `FinanceMathTest`).
### 3. Синхронизация — общий контракт
Единый протокол описан в `docs/SYNC_PROTOCOL.md` (сводно) и подробно —
в `BalanceServer/docs/API.md` и `BalanceServer/docs/SYNC.md`. Клиентские
реализации:
- Apple: `Balance/Balance/Shared/ServerSync.swift`;
- Android: `BalanceAndroid/.../sync/SyncRepository.kt`.
Изменение cursor/sequence semantics, JSON-полей или auth-заголовков —
breaking change для всех клиентов сразу. Не меняй его в одном
подпроекте, не проверив остальные два.
### 4. Безопасность (сквозные требования)
- Секреты (пароли, access/refresh токены) никогда не хранятся в
открытом виде: Keychain (Apple), Android Keystore + AES/GCM
(Android), Argon2id-хеши + SHA-256 refresh-token хеши (сервер).
- HTTPS обязателен для удалённого сервера на всех клиентах; HTTP
разрешён только для `localhost`/`127.0.0.1`/`::1`.
- Не логируй пароли, токены или заголовок `Authorization` ни в одном
из подпроектов.
- Не коммить секреты, production-URL или credentials.
Подробности — `docs/SECURITY.md` и `BalanceServer/docs/SECURITY.md`.
### 5. Тестирование перед PR
Запусти проверки для всех подпроектов, которые ты менял:
```bash
# Apple (из Balance/)
xcodebuild -project Balance.xcodeproj -scheme Balance \
-destination 'platform=iOS Simulator,name=<available iPhone>' test
# Android (из BalanceAndroid/)
./gradlew clean test assembleDebug
# Server (из BalanceServer/)
go test ./...
go vet ./...
go build ./...
```
Если менялся общий контракт (API/sync/data model) — прогони проверки
во всех трёх, а не только в изменённой папке.
### 6. Документация
- Меняешь контракт синхронизации → обнови `docs/SYNC_PROTOCOL.md` в
корне **и** `BalanceServer/docs/SYNC.md`/`API.md`, а также
`docs/SYNC.md` в `Balance/` и `BalanceAndroid/`.
- Меняешь модель данных на любой платформе → обнови `docs/DATA_MODEL.md`
в корне и в затронутом подпроекте.
- Меняешь способ сборки/запуска → обнови `docs/DEVELOPMENT.md` в
корне и соответствующий `README.md`/`docs/DEVELOPMENT.md` подпроекта.
- Каждый подпроект содержит собственный подробный `AGENTS.md` — этот
файл не заменяет их, а даёт общую картину и правила координации между
платформами.
## PR checklist (для изменений, затрагивающих несколько платформ)
- [ ] Определены все подпроекты, которые затрагивает изменение.
- [ ] Общий контракт (API/sync/data model) обновлён согласованно во
всех платформах, а не только в одной.
- [ ] Финансовые расчёты остаются идентичными на Apple и Android.
- [ ] Обновлены `docs/SYNC_PROTOCOL.md`, `docs/DATA_MODEL.md` в корне,
если менялась схема/протокол.
- [ ] Секреты и токены не добавлены в репозиторий ни в одном подпроекте.
- [ ] Тесты пройдены в каждом изменённом подпроекте.
- [ ] Локальный `AGENTS.md` соответствующего подпроекта тоже соблюдён.