# Git-стратегия - почему монорепо ## Решение (ADR-001) **Выбрано: монорепо в корне `/` с двумя пакетами `indexium-backend/` и `indexium-frontend/`.** Альтернатива - полирепо (два отдельных git) - отклонена на старте. ## Почему монорепо | Критерий | Монорепо | Полирепо | |----------|----------|----------| | Onboarding нового разработчика | `git clone` один раз, `docker compose up` | 2 clone, синхронизация версий | | Атомарные изменения API+UI | Один коммит/PR меняет `api-spec` + фронт-клиент | Два PR, риск рассинхрона | | CI | Один pipeline, один статус | Два pipeline, дублирование | | Версионирование контрактов | Фронт всегда соответствует бэку в `main` | Нужен отдельный версионинг | | Стоимость поддержки | Минимальна для 1-3 человек | Оверхед: 2 набора настроек, 2 issue-треккера | Монорепо оправдан пока команда <10 человек и релизный цикл единый. Если в будущем бэкенд и фронт разойдутся по командам/каденсу - легко разрезать через `git filter-repo` или `git subtree`. ## Что было сделано 1. Удалён пустой `.git` из `indexium-backend/` (коммитов не было - безопасно). 2. `git init --initial-branch=main` в корне `Indexium/`. 3. Корневой `.gitignore` + локальные. 4. Весь код теперь трекается как: ``` Indexium/ .git/ .gitignore README.md todo.md docs/ indexium-backend/ indexium-frontend/ ``` ## Workflow ### Ветки - `main` - защищённая, только через PR. - `feat/-` - фичи, напр. `feat/webhook-hmac`. - `fix/-`. ### Коммиты (Conventional Commits) ``` feat(api): add GET /mods with FTS fix(worker): handle missing quilt.mod.json docs(arch): describe queue retry chore(frontend): bump svelte 5.56 → 5.57 ``` ### PR - Один PR = одна фича/фикс. - Если меняется API - в том же PR обновляется `docs/api-spec.md` и фронт-клиент. - CI должен пройти: `cargo fmt --check`, `cargo clippy`, `cargo test`, `svelte-check`. ### Локально ```bash git clone Indexium && cd Indexium git checkout -b feat/my-feature # ... код ... cargo fmt && cargo clippy -- -D warnings git add -A && git commit -m "feat(scope): message" git push -u origin feat/my-feature # → создать PR ``` ## Когда резать на полирепо Сигналы что пора: - >10 активных контрибьюторов, частые конфликты в `main`. - Фронт деплоится 10× в день, бэк - 1× в неделю (разный каденс). - Нужны разные права доступа (внешние контрибьюторы только к фронту). Как резать: `git subtree split -P indexium-backend -b backend-only` и аналогично для фронта, либо `git filter-repo --path`. ## Альтернативы (для справки) - **Git submodules** - не рекомендуется: сложны, легко сломать, плохой DX. - **Polyrepo + shared package** - имеет смысл если выносить `openapi`/`types` в отдельный npm/crate. ## ADR - ADR-001: Монорепо vs полирепо - принято монорепо (этот документ). - Следующие ADR складывать в `docs/adr/NNN-title.md`.