Appearance
ADR 003: Monorepo Tek Repo + npm Workspaces
- Tarih: 2026-04-16
- Durum: Kabul Edildi (Accepted)
- İlgili Bileşen: Repo Yapısı / Build Sistemi
- Bağlam Dosyaları:
../../architecture/system-overview.md,../../../CLAUDE.md§1 - Sahip: Simetri
1. Bağlam ve Problem
Humindx, docs'ta tanımlı hedef mimariye göre en az iki TypeScript servisi (services/api-gateway NestJS, clients/b2b-panel Next.js), bir Python servisi (services/psychometric-engine FastAPI) ve bir mobil istemci (clients/b2c-mobile React Native veya Flutter) barındıracak. Mobil istemcinin de TS kullanması muhtemel. 3-4 TS projesi + 1-2 Python projesi = klasik çok-dilli monorepo.
İki soru:
- Tek repo mu, çoklu repo mu?
- Tek repo ise TS projeleri için hangi workspace/monorepo aracı (npm / pnpm / yarn / Nx / Turborepo / yok)?
Python servisi bu kararın dışında — kendi pyproject.toml ile bağımsız yönetilir.
2. Karar
- Tek repo (monorepo) —
services/,clients/,docs/,infra/kardeş klasörler. - TS projeleri için npm workspaces — sıfır yeni araç; her alt proje kendi
package.json'unu tutar, kökpackage.jsonworkspaces array'i ile bunları bağlar. - Shared TS config — kök
tsconfig.base.jsonher alt proje tarafındanextendsedilir. - Python servisi —
services/psychometric-engine/pyproject.toml, workspace sistemi dışında; CI'da ayrı job.
3. Değerlendirilen Alternatifler
3.1. Çoklu Repo (her servis kendi repo'su)
- Artıları: Repo izolasyonu, küçük git history, bağımsız deploy.
- Eksileri: docs'u hangi repo'da tutacağız? Çapraz değişiklik (örn:
api-contracts.md+ hem API hem client güncellemesi) çoklu PR demek. Pre-development ekip için koordinasyon yükü. - Neden seçilmedi: Ekip <5 kişi iken monorepo'nun basitliği ağır basar. Çoklu repo'ya ihtiyaç ekibin "servis sahipliği" netleşince duyulur.
3.2. pnpm Workspaces
- Artıları: Hızlı install, disk-verimli (content-addressable store), katı bağımlılık hoisting (phantom dep yok), iyi monorepo desteği.
- Eksileri: Yeni bir araç (npm ile gelmiyor); CI'da setup adımı + developer machine'e kurulum.
- Neden seçilmedi: Şu an 2-3 TS projesi için npm workspaces yeterli. Dep graph'ta pain (phantom deps, slow install) yaşanırsa migrate kolay — sadece lockfile + workspace syntax değişir.
3.3. Yarn v4 Workspaces + PnP
- Artıları: Hızlı, zero-install.
- Eksileri: PnP ile TS/Jest/editör uyumsuzlukları hala sık; ek yapılandırma gerekir.
- Neden seçilmedi: Stabilite-karmaşıklık dengesi npm'in altında.
3.4. Nx veya Turborepo
- Artıları: Graph-based build cache, etkilenen proje tespiti, büyük monorepo'lar için vazgeçilmez.
- Eksileri: Konfigürasyon overhead, learning curve, 2-3 projede ROI yok.
- Neden seçilmedi: "Çözüm arayan problem" sınıfı. CI süresi > 10 dk olunca veya proje sayısı 5+ olunca Turborepo eklenir (migrate kolaydır; npm workspaces hala altta çalışır).
3.5. Hiç Workspace Aracı — Her Proje Tam Bağımsız
- Artıları: En basit.
- Eksileri: Shared TS config'i her projede kopyala, hangi versiyonun nerede olduğu belirsiz, shared utility çıkartıldığında ayrı package publish gerekir.
- Neden seçilmedi: İlk shared type (örn.
packages/shared-contracts) gerektiğinde patlıyoruz.
4. Gerekçeler
- Sıfır yeni araç. Node ile gelir; CI/CD kurulumu daha basit; yeni developer extra tool kurmaz.
- Migrasyon ucuz.
pnpm-workspace.yaml+pnpm installile pnpm'e geçiş yarım saatte tamamlanır; Nx/Turborepo da npm workspaces üzerine eklenir. - Çapraz değişiklik kolaylığı.
api-contracts.md+ kontratı kullanan istemcinin aynı PR'da güncellenmesi mümkün (bkz.CONTRIBUTING.md§8.4). - Dev deneyimi yeterli. VS Code, TypeScript Language Server ve Jest npm workspaces ile sorunsuz çalışır.
- Python servisi etkilenmez. Kendi
pyproject.tomlve.venv'i ile çalışır; CI'da ayrı job.
5. Sonuçlar ve Gelecek Etkileri
Klasör yapısı (hedef):
humindx/
├── package.json ← Workspaces root
├── tsconfig.base.json
├── services/
│ ├── api-gateway/ ← NestJS (TS workspace)
│ │ ├── package.json
│ │ └── tsconfig.json (extends ../tsconfig.base.json)
│ └── psychometric-engine/ ← FastAPI (pyproject.toml, NOT in npm workspace)
├── clients/
│ ├── b2c-mobile/ ← React Native / Flutter (TBD)
│ └── b2b-panel/ ← Next.js (TS workspace)
├── packages/ ← (future) shared TS utilities if needed
└── infra/ ← Docker, TerraformAvantajlar:
- Tek
npm installtüm TS projelerini kurar. - Cross-package import (
@humindx/shared-contracts) npm workspaces sayesinde native çalışır. - CI cache tek
package-lock.jsonüzerinden.
Dezavantajlar ve Riskler:
- Tek
package-lock.jsonbüyüdükçe CI install süresi artar. - npm hoisting "phantom dependency" sorunlarına yol açabilir (bir paket, açıkça belirtmediği bağımlılıkları hoisting sayesinde import edebilir — prod'da patlar).
Hafifletme Stratejisi:
- Phantom dep için CI'da
npm ls+ linter kuralı (import/no-extraneous-dependencies). - CI süresi > 10 dk'ya çıkarsa
npm ci --prefer-offline --no-audit+ cache optimizasyonu; hala yetmezse Turborepo eklenir.
Ne Zaman Yeniden Değerlendirilir?
- TS proje sayısı 5+ olduğunda (Turborepo/Nx)
- CI install süresi > 5 dk (pnpm'e migrate)
- Phantom dep'ten kaynaklı bir prod incident (pnpm katı hoisting)
- Tek bir TS projesi ayrı release cadence'a geçerse (polyrepo'ya split)